<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>计算机网络学习笔记-网络层 | 花猪のBlog</title><meta name="keywords" content="计算机网络"><meta name="author" content="花猪,2296412185@qq.com"><meta name="copyright" content="花猪"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="记录计算机网络学习历程">
<meta property="og:type" content="article">
<meta property="og:title" content="计算机网络学习笔记-网络层">
<meta property="og:url" content="https://cnhuazhu.top/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/index.html">
<meta property="og:site_name" content="花猪のBlog">
<meta property="og:description" content="记录计算机网络学习历程">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/ComputerNetworksCover.jpg">
<meta property="article:published_time" content="2021-06-08T07:10:24.000Z">
<meta property="article:modified_time" content="2021-06-14T15:09:38.454Z">
<meta property="article:author" content="花猪">
<meta property="article:tag" content="计算机网络">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/ComputerNetworksCover.jpg"><link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg"><link rel="canonical" href="https://cnhuazhu.top/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/',
  algolia: undefined,
  localSearch: {"path":"search.xml","languages":{"hits_empty":"找不到您查询的内容：${query}"}},
  translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"簡"},
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":300},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: {"limitCount":60,"languages":{"author":"作者: 花猪","link":"链接: ","source":"来源: 花猪のBlog","info":"著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。"}},
  lightbox: 'fancybox',
  Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#ABADAC","bgDark":"#121212","position":"bottom-right"},
  source: {
    jQuery: 'https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js',
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css'
    },
    fancybox: {
      js: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js',
      css: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isanchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: '计算机网络学习笔记-网络层',
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isToc: true,
  postUpdate: '2021-06-14 23:09:38'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          const now = new Date()
          const hour = now.getHours()
          const isNight = hour <= 6 || hour >= 18
          if (t === undefined) isNight ? activateDarkMode() : activateLightMode()
          else if (t === 'light') activateLightMode()
          else activateDarkMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    
    const fontSizeVal = saveToLocal.get('global-font-size')
    if (fontSizeVal !== undefined) {
      document.documentElement.style.setProperty('--global-font-size', fontSizeVal + 'px')
    }
    })(window)</script><link rel="stylesheet" href="/css/tag.css"><link rel="stylesheet" href="/css/pagelucency.css"><style>#article-container.post-content h1:before, h2:before, h3:before, h4:before, h5:before, h6:before { -webkit-animation: avatar_turn_around 1s linear infinite; -moz-animation: avatar_turn_around 1s linear infinite; -o-animation: avatar_turn_around 1s linear infinite; -ms-animation: avatar_turn_around 1s linear infinite; animation: avatar_turn_around 1s linear infinite; }</style><link rel="stylesheet" href="/css/avatarbg.css"><link rel="stylesheet" href="/css/footerlucency.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/sviptzk/StaticFile_HEXO@latest/butterfly/css/macblack.css"><link rel="stylesheet" href="/css/mouse.css"><!-- hexo injector head_end start --><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-butterfly-swiper/lib/swiper.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-butterfly-swiper/lib/swiperstyle.css"><!-- hexo injector head_end end --><meta name="generator" content="Hexo 5.3.0"><link rel="alternate" href="/atom.xml" title="花猪のBlog" type="application/atom+xml">
</head><body><div id="loading-box"><div class="loading-left-bg"></div><div class="loading-right-bg"></div><div class="wizard-scene"><div class="wizard-objects"><div class="wizard-square"></div><div class="wizard-circle"></div><div class="wizard-triangle"></div></div><div class="wizard"><div class="wizard-body"></div><div class="wizard-right-arm"><div class="wizard-right-hand"></div></div><div class="wizard-left-arm"><div class="wizard-left-hand"></div></div><div class="wizard-head"><div class="wizard-beard"></div><div class="wizard-face"><div class="wizard-adds"></div></div><div class="wizard-hat"><div class="wizard-hat-of-the-hat"></div><div class="wizard-four-point-star --first"></div><div class="wizard-four-point-star --second"></div><div class="wizard-four-point-star --third"></div></div></div></div></div></div><div id="web_bg"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="author-avatar"><img class="avatar-img" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data"><div class="data-item is-center"><div class="data-item-link"><a href="/archives/"><div class="headline">文章</div><div class="length-num">86</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/tags/"><div class="headline">标签</div><div class="length-num">20</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/categories/"><div class="headline">分类</div><div class="length-num">10</div></a></div></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="http://cnhuazhu.top/"><i class="fa-fw fas fa-gift"></i><span> 引导</span></a></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-sitemap"></i><span> 分站</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="http://cnhuazhu.top/next"><i class="fa-fw fas fa-chevron-right"></i><span> Next</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 文章</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></li><li><a class="site-page child" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></li><li><a class="site-page child" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 生活</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/Gallery/"><i class="fa-fw fas fa-images"></i><span> 图库</span></a></li><li><a class="site-page child" href="/books/"><i class="fa-fw fas fa-book"></i><span> 阅读</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-film"></i><span> 电影</span></a></li><li><a class="site-page child" href="/video/"><i class="fa-fw fa fa-video"></i><span> 视频</span></a></li><li><a class="site-page child" href="/artitalk/"><i class="fa-fw fas fa-quote-left"></i><span> 说说</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 链接</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></li><li><a class="site-page child" href="/website/"><i class="fa-fw fas fa-globe"></i><span> 网站</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/Message/"><i class="fa-fw fas fa-comment"></i><span> 留言</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fa fa-heart"></i><span> 关于</span></a></div></div></div></div><div id="body-wrap"><header class="post-bg" id="page-header" style="background: transparent"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">花猪のBlog</a></span><div id="menus"><div id="search-button"><a class="site-page social-icon search"><i class="fas fa-search fa-fw"></i><span> 搜索</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="http://cnhuazhu.top/"><i class="fa-fw fas fa-gift"></i><span> 引导</span></a></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-sitemap"></i><span> 分站</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="http://cnhuazhu.top/next"><i class="fa-fw fas fa-chevron-right"></i><span> Next</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 文章</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></li><li><a class="site-page child" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></li><li><a class="site-page child" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 生活</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/Gallery/"><i class="fa-fw fas fa-images"></i><span> 图库</span></a></li><li><a class="site-page child" href="/books/"><i class="fa-fw fas fa-book"></i><span> 阅读</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-film"></i><span> 电影</span></a></li><li><a class="site-page child" href="/video/"><i class="fa-fw fa fa-video"></i><span> 视频</span></a></li><li><a class="site-page child" href="/artitalk/"><i class="fa-fw fas fa-quote-left"></i><span> 说说</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 链接</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></li><li><a class="site-page child" href="/website/"><i class="fa-fw fas fa-globe"></i><span> 网站</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/Message/"><i class="fa-fw fas fa-comment"></i><span> 留言</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fa fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="post-info"><h1 class="post-title">计算机网络学习笔记-网络层</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2021-06-08T07:10:24.000Z" title="发表于 2021-06-08 15:10:24">2021-06-08</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2021-06-14T15:09:38.454Z" title="更新于 2021-06-14 23:09:38">2021-06-14</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">字数总计:</span><span class="word-count">14.7k</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>46分钟</span></span><span class="post-meta-separator">|</span><span class="post-meta-pv-cv" id="" data-flag-title="计算机网络学习笔记-网络层"><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">阅读量:</span><span id="busuanzi_value_page_pv"></span></span></div></div></div></header><main class="layout" id="content-inner"><div id="post"><article class="post-content" id="article-container"><h1>前言</h1>
<p><em>正在学习计算机网络这门课程，顺便做个笔记，记录一下知识点。</em></p>
<blockquote>
<p>参考资料：</p>
<p>中科大郑烇老师全套《计算机网络（自顶向下方法 第7版，James F.Kurose，Keith W.Ross）》课程：<a target="_blank" rel="noopener external nofollow noreferrer" href="https://www.bilibili.com/video/BV1JV411t7ow?p=1">https://www.bilibili.com/video/BV1JV411t7ow?p=1</a></p>
<p>《计算机网络（自顶向下方法 第7版，James F.Kurose，Keith W.Ross）》</p>
</blockquote>
<hr>
<h1>第四章：网络层</h1>
<h2 id="导论">导论</h2>
<p>网络层所提供的服务：</p>
<ul>
<li>在发送主机和接收主机对之间传送段（segment）
<ul>
<li>在发送端将段封装到数据报中</li>
<li>在接收端，将段上交给传输层实体</li>
</ul>
</li>
<li>网络层协议存在于每一个主机和路由器
<ul>
<li>路由器检查每一个经过它的IP数据报的头部</li>
</ul>
</li>
</ul>
<p>网络层的关键功能：<strong>转发</strong>和<strong>路由</strong></p>
<ul>
<li>
<p>转发：将分组从路由器的输入接口转发到合适的输出接口</p>
<p>这是一个局部的功能</p>
<p>是数据平面的功能</p>
<blockquote>
<p>路由器从不同的端口接收分组，再通过合适的端口将其分发出去。</p>
</blockquote>
</li>
<li>
<p>路由：使用路由算法来决定分组从发送主机到目标接收主机的路径</p>
<p>这是一个全局的功能</p>
<p>是控制平面的功能</p>
<ul>
<li>路由选择算法</li>
<li>路由选择协议</li>
</ul>
</li>
</ul>
<blockquote>
<p>举个例子说明转发与路由：</p>
<p>计算机网络一口气学了好长时间，打算去郊区的公园散散心：</p>
<ul>
<li>转发就好像是在行程中通过每个路口时的决策，从哪里进入路口，又从哪里出去</li>
<li>路由就像是在出发前用手机导航规划全局路径的过程</li>
</ul>
</blockquote>
<h3 id="数据平面与控制平面">数据平面与控制平面</h3>
<ul>
<li>
<p>数据平面：</p>
<p>局部的处理，每个路由的功能：</p>
<ul>
<li>决定从路由器输入端口到达的分组如何转发到输出端口</li>
<li>转发功能：
<ul>
<li>传统方式：基于目标地址 + 转发表</li>
<li>SDN方式：基于多个字段 + 流表</li>
</ul>
</li>
</ul>
</li>
<li>
<p>控制平面：</p>
<p>全局的处理，网络范围内的逻辑：</p>
<ul>
<li>决定数据报如何在路由器之间路由，决定数据报从源到目标主机之间的端到端路径</li>
<li>两个个控制平面方法：
<ul>
<li>传统的路由算法: 在路由器中被实现（路由表）</li>
<li>SDN（software-defined networking，软件定义网络）：在远程的服务器中实现</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>传统方式：每一个路由器既实现了数据平面的功能，也实现了控制平面的功能。</p>
<ul>
<li>
<p>在每一个路由器中的单独路由器算法元件，在控制平面进行交互</p>
<ul>
<li>控制平面：路由算法决定端到端路径（分布式操作）</li>
<li>数据平面：IP协议根据转发表决定了IP数据报在此路由器上的局部转发（分布式操作）</li>
<li>二者是紧耦合的，在一个路由实体中</li>
</ul>
<blockquote>
<p>在路由器之上有路由实体，这些路由实体之间要交换路由信息。然后分布式的计算路由表，交给IP协议实体，然后IP协议实体根据路由表进行匹配，最后转发。</p>
</blockquote>
<ul>
<li>带来的问题：分布式的操作使得修改路由器的运行逻辑是一件困难的事情</li>
</ul>
</li>
</ul>
<p>SDN方式：逻辑集中的控制平面</p>
<ul>
<li>一个不同的（通常是远程的）控制器与本地控制代理（CAs）交互
<ul>
<li>控制平面的功能集中在一个服务器（远程控制器，Remote Controller）上去实现，计算得到流表，将其交给每一个分组交换设备，分组交换设备对流表进行装载，对接收到的IP实体做多字段的匹配（传统方式只匹配目标主机的IP地址），按照流表对应的动作对IP实体进行操作，包括：转发，阻塞（block），泛洪等</li>
<li>分组交换设备仅按照远端的服务器计算发来的流表进行操作，这样改变其行为逻辑就会简单许多。</li>
<li>由此分析：控制平面是集中式的、远程的，便于修改。</li>
</ul>
</li>
</ul>
<h3 id="网络服务模型">网络服务模型</h3>
<p>从发送方主机到接收方主机传输数据报的“通道”，网络提供的服务模型：</p>
<ul>
<li>对于单个数据报的服务：
<ul>
<li>可靠传送</li>
<li>延迟保证，如：少于40ms的延迟</li>
</ul>
</li>
<li>对于数据报流的服务：
<ul>
<li>保序数据报传送</li>
<li>保证流的最小带宽</li>
<li>分组之间的延迟差</li>
</ul>
</li>
<li>连接建立：在某些网络架构中是第三个重要的功能
<ul>
<li>在分组传输之前，在两个主机之间，在通过一些路由器所构成的路径上建立一个网络层连接（涉及到路由器）</li>
<li>网络层和传输层连接服务区别：
<ul>
<li>网络层: 在两个主机之间，涉及到路径上的一些路由器</li>
<li>传输层: 在两个进程之间，很可能只体现在端系统上(TCP连接)</li>
</ul>
</li>
</ul>
</li>
</ul>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN网络层服务模型.png" style="zoom:80%;" />
<h2 id="虚电路和数据报网络">虚电路和数据报网络</h2>
<p>网络层能够在两台主机之间提供无连接的服务或有连接的服务</p>
<ul>
<li>数据报网络（datagram network）仅在网络层提供无连接服务</li>
<li>虚电路网络（Virtual-Circuit，VC）仅在网络层提供连接服务</li>
</ul>
<p>由上一章我们知道运输层也可以实现面向连接的服务，但是这与网络层实现连接服务是不同的：</p>
<ul>
<li>
<p>网络层提供的是主机到主机（host-to-host）间的服务</p>
<blockquote>
<p>运输层提供进程到进程间的服务</p>
</blockquote>
</li>
<li>
<p>网络层连接服务除了在端系统中，也在位于网络核心的路由器中出现</p>
<blockquote>
<p>运输层的连接服务只在端系统中实现</p>
</blockquote>
</li>
</ul>
<h3 id="虚电路网络">虚电路网络</h3>
<p>虚电路网络从源头到目的地的路径表现得很像电话线路。</p>
<p>一条虚电路的组成如下：</p>
<ul>
<li>
<p>源和目的主机之间的路径（即一系列链路和路由器）</p>
</li>
<li>
<p>VC号，沿着该路径的每段链路的一个号码</p>
</li>
<li>
<p>沿着该路径的每台路由器中的转发表表项</p>
<blockquote>
<p>属于一条虚电路的分组将在它的首部携带一个VC号。因为一条虚电路在每条链路上可能具有不同的VC号，每台中间路由器必须用一个新的VC号替代每个传输分组的VC号，该新的VC号从转发表获得。</p>
</blockquote>
</li>
</ul>
<p>下图展示了一个简单的虚电路网络和对应路由器的转发表</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E5%99%A8%E8%BD%AC%E5%8F%91%E8%A1%A8.png" alt=""></p>
<blockquote>
<p>虚电路中路由器维持着连接状态信息</p>
</blockquote>
<p><em>（埋个坑，以后补充）</em></p>
<h2 id="路由器的组成">路由器的组成</h2>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E5%99%A8%E7%BB%93%E6%9E%84%E6%A6%82%E5%86%B52.png" alt=""></p>
<p>路由：运行路由选择算法／协议 (RIP, OSPF, BGP)-生成路由表</p>
<p>路由器的组成包括：</p>
<ul>
<li>输入端口</li>
<li>输出端口</li>
<li>交换机（high-seed switching fabric）将输入端口与输出端口连接起来，构成局部的转发（根据路由表）。</li>
</ul>
<h3 id="输入端口">输入端口</h3>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3%E5%8A%9F%E8%83%BD.png" alt=""></p>
<ul>
<li>
<p>物理层：把物理信号转化为数字信号（Bit级接收）</p>
</li>
<li>
<p>数据链路层：链路层协议动作、解封装得到IP协议实体</p>
<blockquote>
<p>判断帧头、帧尾，利用CRC检查出错（具体见下一章）</p>
</blockquote>
</li>
<li>
<p>网络层：通过路由表将分组进行转发</p>
<p>分布式交换：</p>
<ul>
<li>根据数据报头部的信息如：目的地址，在输入端口内存中的转发表中查找合适的输出端口（匹配+行动）</li>
<li>基于目标的转发：仅仅依赖于IP数据报的目标IP地址（传统方法）</li>
<li>通用转发：基于头部字段的任意集合进行转发</li>
</ul>
</li>
<li>
<p>输入端口缓存：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3%E7%BC%93%E5%AD%98.png" alt=""></p>
<p>在输入端口会有一个队列，用于缓解输出、输入的不一致性。</p>
<ul>
<li>
<p>当交换机构的速率小于输入端口的汇聚速率时， 在输入端口可能要排队</p>
<blockquote>
<p>排队延迟以及由于输入缓存溢出可能造成丢失</p>
</blockquote>
</li>
<li>
<p>排在队头的数据报阻止了队列中其他数据报向前移动</p>
</li>
</ul>
</li>
</ul>
<h3 id="交换结构">交换结构</h3>
<p>交换速率：分组可以按照该速率从输入传输到输出</p>
<ul>
<li>运行速度经常是输入/输出链路速率的若干倍</li>
<li>如果是N 个输入端口：交换机构的交换速度是输入线路速度的N倍比较理想，才不会成为瓶颈</li>
</ul>
<p>下面我们来分析分组如何从输入端口转向输出端口：</p>
<p>三种典型的交换机构</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E4%B8%89%E7%A7%8D%E5%85%B8%E5%9E%8B%E7%9A%84%E4%BA%A4%E6%8D%A2%E6%9C%BA%E6%9E%84.png" alt=""></p>
<ul>
<li>
<p>基于memory（内存）</p>
<ul>
<li>
<p>第一代路由器</p>
</li>
<li>
<p>路由器就是一个计算机，通过软件的方式实现路由</p>
</li>
<li>
<p>输入端口和输出端口分别插入网卡，从输入端口接收来的分组，通过系统总线，交给路由软件，匹配路由表，最后决定从哪一个网口发出。</p>
</li>
<li>
<p>转发速率被内存的带宽限制 (数据报通过BUS两遍)</p>
</li>
<li>
<p>一次只能转发一个分组</p>
</li>
</ul>
</li>
<li>
<p>基于bus（总线）</p>
<ul>
<li>数据报通过共享总线，从输入端口转发到输出端口</li>
<li>总线竞争: 交换速度受限于总线带宽</li>
<li>一次处理一个分组</li>
<li>总线速度能达到：Cisco 1900：1 Gbps；Cisco 5600：32 Gbps。对于接 入或企业级路由器，速度足够（ 但不适合区域或骨干网络）</li>
</ul>
</li>
<li>
<p>基于crossbar（互联网络）</p>
<ul>
<li>同时并发转发多个分组，克服总线带宽限制</li>
<li>当分组从端口A到达，转给端口Y；控制器短接相应的两个总线</li>
<li>高级设计：将数据报分片为固定长度的信元，通过交换网络交换（分组长度是不同的）</li>
<li>Cisco12000：以60Gbps的交换速率通过互联网络</li>
</ul>
</li>
</ul>
<h3 id="输出端口">输出端口</h3>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3%E5%8A%9F%E8%83%BD.png" alt=""></p>
<ul>
<li>
<p>网络层：接收fabric传来的分组，将分组排队，将分组交给对应链路层的网卡</p>
<blockquote>
<ul>
<li>当数据报从交换机构的到达速度比传输速率快 就需要输出端口缓存</li>
<li>同样，如果队列溢出，分组丢失</li>
<li>由调度规则选择排队的数据报进行传输（并不一定是先来先服务）</li>
</ul>
</blockquote>
</li>
<li>
<p>链路层：封装成帧（添加帧头、帧尾、目标MAC地址）</p>
</li>
<li>
<p>物理层：将数字信号转化为物理信号，将数据传出去</p>
</li>
<li>
<p>输出端口排队：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3%E7%BC%93%E5%AD%98.png" alt=""></p>
<ul>
<li>假设交换速率R<sub>switch</sub>是R<sub>line</sub>的N倍（N：输入端口的数量）</li>
<li>当多个输入端口同时向输出端口发送时，缓冲该分组（当通过交换网络到达的速率超过输出速率则缓存）</li>
<li>排队带来延迟，由于输出端口缓存溢出则丢弃数据报（不一定丢弃最后进入队列的分组，取决于规则）</li>
</ul>
</li>
</ul>
<h3 id="调度机制">调度机制</h3>
<p>调度: 选择下一个要通过链路传输的分组</p>
<ul>
<li>FIFO (first in first out) scheduling: 按照分组到来的次序发送
<ul>
<li>丢弃策略：
<ul>
<li>tail drop: 丢弃刚到达的分组</li>
<li>priority: 根据优先权丢失/移除分组</li>
<li>random: 随机地丢弃/移除</li>
</ul>
</li>
</ul>
</li>
<li>优先权调度：发送最高优先权的分组
<ul>
<li>多类，不同类别有不同的优先权
<ul>
<li>类别可能依赖于标记或者其他的头部字段（如：IP source/dest, port numbers, ds，等）</li>
<li>先传高优先级的队列中的分组，除非没有</li>
<li>高（低）优先权中的分组传输次序：FIFO</li>
</ul>
</li>
</ul>
</li>
<li>轮转 （Round Robin (RR) ）调度：
<ul>
<li>多类</li>
<li>循环扫描不同类型的队列, 发送完一类的一个分组，再发送下一个类的一个分组，循环所有类</li>
</ul>
</li>
<li>Weighted Fair Queuing (WFQ，加权公平队列)：
<ul>
<li>一般化的Round Robin</li>
<li>在一段时间内，每个队列得到的服务时间是：W<sub>i</sub>  / (XIGMA(W<sub>i</sub> )) ×t，和权重成正比</li>
<li>每个类在每一个循环中获得不同权重的服务量</li>
</ul>
</li>
</ul>
<h2 id="IP协议（Internet-Protocol）">IP协议（Internet Protocol）</h2>
<p>IP协议在整个协议栈的位置：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP协议栈位置.png" style="zoom:80%;" />
<h3 id="IP数据报格式">IP数据报格式</h3>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E6%95%B0%E6%8D%AE%E6%8A%A5%E6%A0%BC%E5%BC%8F.png" alt=""></p>
<ul>
<li>固定20字节头部（一行4字节，固定一共5行）</li>
<li>除固定20字节头部外有可选项部分</li>
<li>body部分（数据载荷部分）
<ul>
<li>TCP的段</li>
<li>UDP的数据报</li>
</ul>
</li>
</ul>
<blockquote>
<p>说明：</p>
<ul>
<li>
<p>ver（IP 协议版本号，4bit）：4 → IPv4； 6 → IPv6</p>
</li>
<li>
<p>head.len（头部长度，4bit）：以字节为单位</p>
</li>
<li>
<p>type of service（数据类型，8bit）：标识数据报载荷的类型，为了使分组调度时有依据（由于IP网络运营模式，现在基本不用）</p>
</li>
<li>
<p>length（数据报总长，16bit）：标识此IP数据报的总长，以字节为单位</p>
</li>
<li>
<p>分片/重组使用（如果IP数据报超过链路层的最大传输单元MTU，就会分片）</p>
<ul>
<li>16-bit identifier（16bit）：判断分片是否是同一个IP数据报</li>
<li>flags（4bit）：1 → 后面还有分片；0 → 后面无分片（此分片是最后一个）</li>
<li>fragment offset（12bit）：偏移量</li>
</ul>
</li>
<li>
<p>time to live（TTL，8bit）：最大剩余段数（每经过一个路由器减一）</p>
</li>
<li>
<p>upper layer（上层协议，8bit）：决定将载荷部分交给上层哪种类型的协议实体（例：TCP、UDP等）</p>
</li>
<li>
<p>Internet checksum（头部校验和，16bit）：数据部分不进行校验，只判断头部是否异常</p>
<blockquote>
<p>IPv6取消了该字段</p>
</blockquote>
</li>
<li>
<p>32 bit source IP address（32位源IP地址）</p>
</li>
<li>
<p>32 bit destination IP address（32位目标IP地址）</p>
</li>
<li>
<p>data：数据报的载荷部分</p>
</li>
<li>
<p>Options（可选部分）：例如，每经过一个交换节点，该地址会被记录在option中，即形成一个经过的路由器的列表，这样一来，目标端就知道该分组的传输路径。</p>
</li>
</ul>
</blockquote>
<h3 id="IP-分片和重组">IP 分片和重组</h3>
<p>IP 分片的原因：</p>
<p>网络链路有MTU (最大传输单元)：链路层帧所携带的最大数据长度。如果IP数据报长度大于MTU，那么就需要将其分片。</p>
<blockquote>
<p>不同的链路类型有不同的MTU</p>
</blockquote>
<p>思考，如果仅仅是将一个IP数据报“粗暴”地直接分片，那么第一片包含头部信息，路由器知道如何处理，那么其他片没有头部信息，路由器便无法识别，显然这样是不行的。那么分片就需要一些“手段”：</p>
<p>假设要传输一个4000字节的数据报：20字节头部 + 3980字节数据</p>
<p>链路层最大传输单元（MTU）为：1500字节</p>
<ul>
<li>
<p>第一片：20Bytes头部 + 1480Bytes数据</p>
<ul>
<li>flags = 1</li>
<li>fragment offset = 0</li>
</ul>
</li>
<li>
<p>第二片：20Bytes头部 + 1480Bytes数据</p>
<ul>
<li>flags = 1</li>
<li>fragment offset = 1480 / 8 = 185</li>
</ul>
</li>
<li>
<p>第三片：20Bytes头部 + 1020Bytes数据</p>
<ul>
<li>flags = 0</li>
<li>fragment offset = 2960 / 8 = 370</li>
</ul>
<blockquote>
<p>注意：在计算偏移量的时候需要除以8（以8字节为单位）</p>
</blockquote>
</li>
</ul>
<p>每一片都到最后的目标主机才进行重组，中间转发节点不重组。</p>
<p>如果到达目标主机的分片有丢失，那么分片全部丢弃。</p>
<h3 id="IPv4">IPv4</h3>
<h4 id="IP编址">IP编址</h4>
<p>IP地址：32位标示，对主机或者路由器的接口编址</p>
<ul>
<li>
<p>一个IP地址和一个接口相关联</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E5%8F%B7%E4%B8%BE%E4%BE%8B.png" alt=""></p>
</li>
</ul>
<p>接口: 主机/路由器和物理链路的连接处</p>
<ul>
<li>路由器通常拥有多个接口</li>
<li>主机也有可能有多个接口</li>
<li>IP地址和每一个接口关联</li>
</ul>
<h4 id="子网（Subnets-）">子网（Subnets)）</h4>
<p>如下图，是一个包含三个子网的网络</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网示例.png" style="zoom:80%;" />
<p>必备的两个条件：</p>
<ul>
<li>IP地址
<ul>
<li>子网部分（高位bits），也称子网号：每个IP是相同的</li>
<li>主机部分（低位bits）</li>
</ul>
</li>
<li>在子网内部分组的收发不需要借助路由器（仅通过交换机），一跳可达。</li>
</ul>
<blockquote>
<p>子网的判断：</p>
<ul>
<li>
<p>要判断一个子网, 将每一个接口从主机或者路由器上分开,构成了一个个网络的孤岛</p>
</li>
<li>
<p>每一个孤岛（网络）都是一个都可以被称之为subnet</p>
</li>
<li>
<p>如下图，共有6个子网：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网示例2.png" style="zoom:67%;" />
</li>
</ul>
</blockquote>
<h4 id="IP地址分类">IP地址分类</h4>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E5%9C%B0%E5%9D%80%E7%B1%BB%E5%9E%8B%E5%88%92%E5%88%86.png" alt=""></p>
<p>A类地址：地址最高位为0，第一个字节的其它7位为网络号，后面三个字节（24bit）为主机号</p>
<ul>
<li>一共有126个网络（2<sup>7</sup> - 2，全零和全一的网络号不使用）</li>
<li>每个网络有2<sup>24</sup> - 2个主机</li>
</ul>
<p>B类地址：地址最高两位为10，前两个字节的其他14位为网络号，后面两个字节（16bit）为主机号</p>
<ul>
<li>一共有2<sup>14</sup> - 2个网络</li>
<li>每个网络有2<sup>16</sup> - 2个主机</li>
</ul>
<p>C类地址：地址最高三位为110，前三个字节的其他21位为网络号，后面一个字节（8bit）为主机号</p>
<ul>
<li>一共有2<sup>21</sup> - 2个网络</li>
<li>每个网络有2<sup>8</sup> - 2个主机</li>
</ul>
<blockquote>
<p>A、B、C类地址称为：“单播地址”</p>
<p>通常获取的都是C类地址</p>
</blockquote>
<p>D类地址（“组播地址”）：最高4位为1110，其余位为组播地址（Multicast address）</p>
<p>E类地址（预留）：最高5位为11110</p>
<blockquote>
<ul>
<li>互联网是以网络（局域网）为单位进行路由信息的通告，传播和计算。
<ul>
<li>每个网络是路由表中的一个表项，而非IP地址</li>
</ul>
</li>
<li>子网信息可以进一步聚集，更高层次可以以广域网为单位。</li>
</ul>
</blockquote>
<p>特殊的IP地址：</p>
<ul>
<li>
<p>约定：</p>
<ul>
<li>
<p>子网部分: 全为0 → 本网络</p>
</li>
<li>
<p>主机部分: 全为0 → 本主机</p>
</li>
<li>
<p>主机部分: 全为1 → 广播地址，这个网路所有的主机</p>
</li>
<li>
<p>127.X.X.X：回路地址（测试地址）：即TCP/UDP数据报传到IP层面后返回</p>
<blockquote>
<p>类似我们在一个web项目的时候，本地测试模拟网络状态，通常地址为127.0.0.1（实际上访问的是本机）</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p>内网(专用)IP地址：</p>
<ul>
<li>专用地址：地址空间的一部份供专用地址使用</li>
<li>永远不会被当做公用地址来分配, 不会与公用地址重复
<ul>
<li>只在局部网络中有意义，区分不同的设备</li>
</ul>
</li>
<li>路由器不对目标地址是专用地址的分组进行转发</li>
<li>专用地址范围：
<ul>
<li>Class A： 10.0.0.0 ~ 10.255.255.255    MASK 255.0.0.0</li>
<li>Class B： 172.16.0.0 ~ 172.31.255.255    MASK 255.255.0.0</li>
<li>Class C： 192.168.0.0 ~ 192.168.255.255    MASK 255.255.255.0</li>
</ul>
</li>
</ul>
<h4 id="无类域间路由（CIDR）">无类域间路由（CIDR）</h4>
<p>CIDR: Classless InterDomain Routing （无类域间路由）</p>
<blockquote>
<p>上述A、B、C类地址存在明确的划分（通过IP号），但这会存在一个问题，A类地址不必说，数量很少，瞬间就被分配完了，B类地址也是一样的道理，但是这类地址可分配的主机数量很多，通常没有企业单位会拥有如此多待分配的主机，为了充分利用资源，所以出现了无类域间路由。</p>
</blockquote>
<p>路由器如何区分无类域间路由？仅凭前几位是无法做到的（没有明确的网络号和主机号位数），因此伴随而生的子网掩码出现了：</p>
<ul>
<li>
<p>如果位为1：表示该位为网络位（子网部分）</p>
</li>
<li>
<p>如果位为0：表示该位为主机位</p>
</li>
<li>
<p>子网部分可以在任意的位置</p>
</li>
<li>
<p>地址格式: <code>a.b.c.d/x</code>, 其中 x 是地址中子网号的长度（另一种表示方式）</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网掩码示例.png" style="zoom:67%;" />
</li>
</ul>
<blockquote>
<p>给定一个IP地址，计算网络号：将IP地址与对应的子网掩码进行<code>与</code>运算</p>
</blockquote>
<blockquote>
<p>原始的A、B、C类网络的子网掩码分别是：</p>
<ul>
<li>A：255.0.0.0 ：11111111 00000000 0000000 00000000</li>
<li>B：255.255.0.0：11111111 11111111 0000000 00000000</li>
<li>C：255.255.255.0：11111111 11111111 11111111 00000000</li>
</ul>
</blockquote>
<p>路由信息的匹配，分析路由表表项：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%BD%AC%E5%8F%91%E8%A1%A8%E5%88%86%E6%9E%90.png" alt=""></p>
<blockquote>
<ul>
<li>目标子网号</li>
<li>子网掩码</li>
<li>下一跳</li>
<li>端口</li>
</ul>
</blockquote>
<ul>
<li>获得IP数据报的目标地址，将其与子网掩码进行<code>与</code>运算，得到网络号</li>
<li>对照路由表的目标子网号进行匹配：
<ul>
<li>如果找到，则按照表项对应的接口转发该数据报</li>
<li>如果都没有找到,则使用默认表项转发数据报</li>
</ul>
</li>
</ul>
<p>一个主机如何获得IP地址：</p>
<ul>
<li>
<p>系统管理员手动分配，每个操作系统不一样</p>
</li>
<li>
<p>DHCP（ Dynamic Host Configuration Protocol）:从服务器中动态获得一个IP地址</p>
<ul>
<li>
<p>基于UDP的服务</p>
</li>
<li>
<p>允许主机在加入网络的时候，动态地从服务器那里获得IP地址：</p>
<ul>
<li>可以更新对主机在用IP地址的租用期（租期快到了）</li>
<li>重新启动时，允许重新使用以前用过的IP地址</li>
<li>支持移动用户加入到该网络（短期在网）</li>
</ul>
</li>
<li>
<p>DHCP工作概况：</p>
<ul>
<li>
<p>主机广播“DHCP discover” 报文[可选]</p>
</li>
<li>
<p>DHCP 服务器用 “DHCP offer”提供报文响应[可选]</p>
</li>
<li>
<p>主机请求IP地址：发送 “DHCP request” 报文</p>
</li>
<li>
<p>DHCP服务器发送地址：“DHCP ack” 报文</p>
<blockquote>
<p>最开始，主机用32位全零的地址作为本机地址，以32位全一的地址进行广播</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDHCP过程.png" style="zoom: 80%;" />
<p>DHCP 返回:</p>
<ul>
<li>IP 地址</li>
<li>第一跳路由器的IP地址（默认网关）</li>
<li>DNS服务器的域名和IP地址</li>
<li>子网掩码 (指示地址部分的网络号和主机号)</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>一个主机如何获得一个网络的子网部分：</p>
<ul>
<li>一个机构，从ISP获得地址块中分配一个小地址块，该机构可以进行小地址块的分配</li>
<li>ICANN: Internet Corporation for Assigned Names and Numbers，通过该机构直接申请IP地址
<ul>
<li>分配地址</li>
<li>管理DNS</li>
<li>分配域名，解决冲突</li>
</ul>
</li>
</ul>
<p>路由聚集（route aggregation）：是一种层次编址的方式，目的是减少路由信息通告、计算的数量。在路由匹配表项的时候，数量要大大减少。</p>
<blockquote>
<p>在路由聚集时，如果出现一个IP地址能匹配到多个路由表项（这是可能出现的）：采用最长前缀匹配，因为更精确。</p>
</blockquote>
<h3 id="NAT（Network-Address-Translation）">NAT（Network Address Translation）</h3>
<p>NAT：网络地址转换</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNNET%E7%A4%BA%E4%BE%8B.png" alt=""></p>
<p>内网主机向外部发送分组时，经过路由，将内网地址转换为外网地址；同样的，外网的分组经路由传向内网时，将外网地址转换为内网地址。（内网节点共用一个IP）</p>
<p>使用NAT的原因：本地网络只有一个有效IP地址（IP地址申请使用需要付费）</p>
<ul>
<li>不需要从ISP分配一块地址，可用一个IP地址用于所有的（局域网）设备 → 省钱</li>
<li>可以在局域网改变设备的地址情况下而无须通知外界</li>
<li>可以改变ISP（地址变化）而不需要改变内部的设备地址，更换方便</li>
<li>局域网内部的设备没有明确的地址，对外是不可见的 → 安全</li>
</ul>
<p>若要实现NAT，则路由器必须支持NAT：</p>
<ul>
<li>
<p>外出数据包：替换源地址和端口号为NAT IP地址和新的端口号，目标IP和端口不变</p>
<blockquote>
<p>远端的C/S将会用NAP IP地址，新端口号作为目标地址</p>
</blockquote>
</li>
<li>
<p>记住每个转换替换对（在NAT转换表中）</p>
<blockquote>
<p>源IP | 端口    vs    NAP IP | 新端口</p>
</blockquote>
</li>
<li>
<p>进入数据包：替换目标IP地址和端口号，采用存储在NAT表中的mapping表项，用（源IP，端口）</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNNET%E7%A4%BA%E4%BE%8B2.png" alt=""></p>
</li>
</ul>
<p>对于NAT是有争议的：</p>
<ul>
<li>
<p>路由器只应该对第3层做信息处理（物理层、链路层、网络层），而这里对端口号（4层，传输层）作了处理，显然不符合分层规范。</p>
</li>
<li>
<p>违反了end-to-end 原则：</p>
<ul>
<li>
<p>端到端原则：复杂性放到网络边缘</p>
<p>无需借助中转和变换，就可以直接传送到目标主机，显然这里路由器也承担了很多工作</p>
</li>
<li>
<p>NAT可能要被一些应用设计者考虑，例如：P2P applications</p>
</li>
<li>
<p>外网的机器无法主动连接到内网的机器上（NAT穿越）</p>
</li>
</ul>
</li>
<li>
<p>NAT出现的原因是为了解决IP地址数量不够分配的情况，现在IP地址短缺的问题可以被IPv6解决</p>
</li>
<li>
<p>NAT穿越：</p>
<p>很明显，内网的设备主动联系外网设备是容易做到的（路由器会在分组发出的时候记录下映射关系），但是如果外网设备主动连接内网中的设备是不可以的，并不知道具体的端口号。</p>
<p>解决方案：</p>
<ul>
<li>
<p>方案一：把路由表固定写死，映射关系是确定的，这样外部来的分组就可以查路由表，交给内网对应的主机。</p>
</li>
<li>
<p>方案二： Universal Plug and Play (UPnP) 协议 / Internet Gateway Device (IGD) 协议</p>
<p>允许内网主机：</p>
<ul>
<li>
<p>获知网络的公共 IP地址</p>
</li>
<li>
<p>列举存在的端口映射</p>
</li>
<li>
<p>增/删端口映射 (在租用时间内)</p>
<blockquote>
<p>自动化静态NAT端口映射配置：外部分组到来，先查询路由表的映射关系，如果没有找到对应的端口，自动分配一个主机，赋予其端口号。</p>
</blockquote>
</li>
</ul>
</li>
<li>
<p>方案三：中继（used in Skype）</p>
<ul>
<li>NAT后面的服务器主动建立和中继的连接（强调：需要主动连接）</li>
<li>外部的客户端链接到中继</li>
<li>中继在两个连接之间桥接</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="ICMP">ICMP</h3>
<p>因特网控制报文协议（ Internet Control Message Protocol，ICMP）</p>
<p>ICMP最典型的用途：差错报告</p>
<ul>
<li>由主机、路由器、网关用于 传达网络层控制信息
<ul>
<li>错误报告：主机不可到达、 网络、端口、协议</li>
<li>Echo 请求和回复（ping）</li>
</ul>
</li>
<li>ICMP处在网络层，但是是在IP协议的上面
<ul>
<li>ICMP消息由IP数据报承载</li>
</ul>
</li>
</ul>
<p>ICMP报文：类型（Type）、编码（Code）、引起ICMP报文首次生成的IP数据报首部和前8个字节内容（以便发送方能确定引发该差错的数据报）</p>
<table>
<thead>
<tr>
<th>ICMP类型</th>
<th>编码</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>回显回答（对ping的回答）</td>
</tr>
<tr>
<td>3</td>
<td>0</td>
<td>目的网络不可达</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>目的主机不可达</td>
</tr>
<tr>
<td>3</td>
<td>2</td>
<td>目的协议不可达</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>目的端口不可达</td>
</tr>
<tr>
<td>3</td>
<td>6</td>
<td>目的网络未知</td>
</tr>
<tr>
<td>3</td>
<td>7</td>
<td>目的主机未知</td>
</tr>
<tr>
<td>4</td>
<td>0</td>
<td>源抑制（拥塞控制）</td>
</tr>
<tr>
<td>8</td>
<td>0</td>
<td>回显请求</td>
</tr>
<tr>
<td>9</td>
<td>0</td>
<td>路由器通告</td>
</tr>
<tr>
<td>10</td>
<td>0</td>
<td>路由器发现</td>
</tr>
<tr>
<td>11</td>
<td>0</td>
<td>TTL过期</td>
</tr>
<tr>
<td>12</td>
<td>0</td>
<td>IP首部损坏</td>
</tr>
</tbody>
</table>
<h4 id="Traceroute">Traceroute</h4>
<ul>
<li>源主机发送一系列UDP段给目标主机
<ul>
<li>第一个：TTL =1</li>
<li>第二个： TTL=2</li>
<li>依次递增</li>
<li>一个不可达的端口号</li>
</ul>
</li>
<li>当 nth 数据报到达 nth 路由器：
<ul>
<li>路由器抛弃数据报</li>
<li>然后发送一个给源主机的ICMP报文 (type 11, code 0) → TTL过期</li>
<li>报文包括了路由器的名字和IP地址</li>
</ul>
</li>
<li>当 ICMP报文到达，源端计算RTT</li>
<li>标准的Traceroute程序实际上用相同的TTL发送3个一组的分组；因此Traceroute输出对每个TTL提供了3个结果</li>
<li>停止的判据：
<ul>
<li>UDP 段最终到达目标主机</li>
<li>目标返回给源主机ICMP “端口不可达”报文 (type 3, code 3)</li>
<li>当源主机获得这个报文时，停止</li>
</ul>
</li>
</ul>
<hr>
<h3 id="IPv6">IPv6</h3>
<p>引入IPv6的动机：IPv4的32-bit地址空间将会被很快用完</p>
<p>其他的原因：使用IPv4时路由器负担太重</p>
<blockquote>
<p>IP数据报在每次经过路由时TTL就会减一，相应的头部长度就会变，首部校验和也会跟着改变，那么每一跳路由都需要进行校验和，此外上述提到的分片，加大了路由转发的负担。</p>
</blockquote>
<p>IPv6数据报格式：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv6%E6%A0%BC%E5%BC%8F.png" alt=""></p>
<blockquote>
<p>说明：</p>
<ul>
<li>
<p>固定的40字节头部</p>
</li>
<li>
<p>数据报传输过程中，不允许分片</p>
<blockquote>
<p>考虑如果分组太大，超过链路层的最大传输单元MTU，该如何处理？</p>
<p>分组会被丢掉，同时向源主机发送一个ICMPv6的错误报告，目的让源主机重新发送更小的分组。</p>
</blockquote>
</li>
<li>
<p>长度由32位变为128位</p>
</li>
<li>
<p>Priority（pri）: 标示流中数据报的优先级</p>
</li>
<li>
<p>Flow Label（流标签）：标示数据报在一个“flow”</p>
<p>同一个IP发送出去的同一个会话的数据，可以形成一个流，让网络对同一个流的数据做同样的处理</p>
</li>
<li>
<p>Next header：标示上层协议（相当于IPv4中的upper layer（上层协议））</p>
<p>标识传来的数据应该交给上层的哪一个协议实体去处理。</p>
</li>
<li>
<p>hop limit：（相当于IPv4中的TTL）</p>
</li>
</ul>
<p>相比于IPv4的其他变化：</p>
<ul>
<li>Checksum: 被移除掉，降低在每一段中的处理速度</li>
<li>Options: 允许，但是在头部之外, 被 “Next Header” 字段标示</li>
<li>ICMPv6: 新增ICMP的新版本
<ul>
<li>附加了报文类型，例如：“Packet Too Big”</li>
<li>增加多播组管理功能</li>
</ul>
</li>
</ul>
</blockquote>
<p>IPv4到IPv6的过渡：</p>
<p>不是所有的路由器都能够同时升级的，那么在IPv4和IPv6路由器混合时，网络如何运转？</p>
<p>同时升级不可行，因此只能采用平滑升级。</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4%E5%88%B0IPv6%E7%9A%84%E8%BF%87%E6%B8%A1.png" alt=""></p>
<blockquote>
<p>分析上图，在目前一段时间内，可能有部分支持IPv6设备，它们在整个IPv4的“网络海洋”中犹如一个个的“孤岛”，支持IPv6与IPv4的设备不能相互通信（当然IPv6内部的网络可以通信，IPv4同样如此），如果一个IPv6的“孤岛”想向另一个IPv6的“孤岛”发送信息，只需要给分组在IPv4的“网络海洋”之中准备一艘“小船”就好，或者是隧道。</p>
</blockquote>
<p>隧道: 在IPv4路由器之间传输的IPv4数据报中携带IPv6数据报</p>
<blockquote>
<p>在IPv6与IPv4的边缘有同时支持两种协议的双栈协议。</p>
</blockquote>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4%E9%9A%A7%E9%81%93.png" alt=""></p>
<p>可以将IPv6的数据报封装在IPv4的数据报当中，进行传输。</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4隧道视图2.png" style="zoom:80%;" />
<blockquote>
<p>全面部署IPv6还需要很长一段时间，当慢慢地网络变成IPv6的“海洋”时，IPv4称为“孤岛”，那么则使用IPv6的隧道进行数据报传输，直到最后全面部署IPv6，完成平滑过渡。</p>
</blockquote>
<h2 id="路由选择算法">路由选择算法</h2>
<h3 id="路由（route）">路由（route）</h3>
<p>路由：按照某种指标(传输延迟,所经过的站点数目等)找到一条从源节点到目标节点的较好路径。</p>
<blockquote>
<ul>
<li>
<p>较好路径: 按照某种指标较小的路径</p>
</li>
<li>
<p>指标:站数, 延迟,费用,队列长度等, 或者是一些单纯指标的加权平均</p>
<p>采用什么样的指标,表示网络使用者希望网络在什么方面表现突出,什么指标网络使用者比较重视</p>
</li>
</ul>
</blockquote>
<p>路由的计算单位：网络（子网）</p>
<blockquote>
<p>以IPv4为例，如果仅以精确的IP地址为计算单位，一共有2<sup>32</sup>个，那么这个计算量过于庞大。</p>
</blockquote>
<ul>
<li>网络为单位进行路由，路由信息传输、计算和匹配的代价低</li>
<li>前提条件是：一个网络所有节点地址前缀相同，且物理上聚集</li>
<li>路由就是：计算网络到其他网络如何走的问题（路由信息通告+路由计算）</li>
</ul>
<p>网络 - 网络的路由 = 路由器 - 路由器间的路由</p>
<ul>
<li>网络对应的路由器到其他网络对应的路由器的路由</li>
<li>在一个网络中：路由器 - 主机之间的通信，链路层解决</li>
<li>到了这个路由器就是到了这个网络</li>
</ul>
<p>路由器 - 路由器之间的最优路径 = 主机对之间的最优路径</p>
<ul>
<li>路由器连接子网，子网到路由器之间的跳数就是一跳，必须要走</li>
<li>路由器到下一跳路由器（节点到节点）之间的最优路径找到了，也就找到了从源子网向目标子网所有主机对之间的最优路径</li>
<li>大大降低了路由计算的规模</li>
<li>在路由计算中按照子网到子网的路径计算为目标，而不是主机到主机</li>
</ul>
<p>路由选择算法(routing algorithm)：网络层软件的一部分,完成路由功能</p>
<p>下图为网络的图抽象</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN网络的图抽象.png" style="zoom:80%;" />
<blockquote>
<p>说明：</p>
<ul>
<li>节点：路由器</li>
<li>边：把路由器连接在一起的网络或者是点到点的链路</li>
</ul>
</blockquote>
<p>边的代价（Cost of path）：</p>
<ul>
<li>表示方式：c(x,x<sup>‘</sup>) → 链路的代价 (x,x<sup>’</sup>)</li>
</ul>
<blockquote>
<p>举例：c(w,z) = 5</p>
</blockquote>
<ul>
<li>代价可能总为１</li>
<li>或是链路带宽的倒数</li>
<li>或是拥塞情况的倒数</li>
</ul>
<p>路由的输入：拓扑、边的代价、源节点</p>
<p><strong>最优化原则(optimality principle)</strong></p>
<p>路由算法的最终目的是找到汇集树（sink tree）</p>
<ul>
<li>此节点到所有其它节点的最优路径形成的树</li>
<li>路由选择算法就是为所有路由器找到并使用汇集树</li>
</ul>
<p><strong>路由选择算法的原则：</strong></p>
<ul>
<li>
<p>正确性(correctness)：</p>
<p>算法必须是正确的和完整的,使分组一站一站接力，正确发向目标站；完整：目标所有的站地址，在路由表中都能找到相应的表项；没有处理不了的目标站地址；</p>
</li>
<li>
<p>简单性(simplicity)：</p>
<p>算法在计算机上应简单：最优但复杂的算法，时间上延迟很大，不实用，不应为了获取路由信息增加很多的通信量；</p>
<blockquote>
<p>在一条公路上，为了市民更好的通行而派出大量的警力去维持秩序，结果警力就占用了公路的三分之二，显然是不合理的。</p>
</blockquote>
</li>
<li>
<p>健壮性(robustness)：</p>
<p>算法应能适应<strong>通信量</strong>和<strong>网络拓扑</strong>的变化：通信量变化，网络拓扑的变化算法能很快适应；不向很拥挤的链路发数据，不向断了的链路发送数据；</p>
<blockquote>
<ul>
<li>两个路由节点之间的通信链路的传输速度有可能会发生改变</li>
<li>网络拓扑有可能发生改变：可能A、B两个节点原来是有通路的，结果这条通路又断掉了</li>
</ul>
<p>算法应该要适应这些变化。</p>
</blockquote>
</li>
<li>
<p>稳定性(stability)：</p>
<p>产生的路由不应该摇摆</p>
</li>
<li>
<p>公平性(fairness)：</p>
<p>对每一个站点都公平</p>
</li>
<li>
<p>最优性(optimality)：</p>
<p>某一个指标的最优，时间上，费用上，等指标，或综合指标；实际上，获取最优的结果代价较高，可以是次优的</p>
</li>
</ul>
<p>路由算法的分类：</p>
<p>从一个角度来看，可分为全局、分布式</p>
<ul>
<li>全局：
<ul>
<li>所有的路由器拥有完整的拓扑和边的代价的信息</li>
<li>link state 算法</li>
</ul>
</li>
<li>分布式：
<ul>
<li>路由器只知道与它有物理连接关系的邻居路由器，和到相应邻居路由器的代价值</li>
<li>叠代地与邻居交换路由信息、 计算路由信息</li>
<li>distance vector 算法</li>
</ul>
</li>
</ul>
<p>从另一个角度看，可分为静态、动态</p>
<ul>
<li>静态：
<ul>
<li>路由随时间变化缓慢</li>
<li>非自适应算法(non-adaptive algorithm)：不能适应网络拓扑和通信量的变化,路由表是事先计算好的</li>
</ul>
</li>
<li>动态：
<ul>
<li>路由变化很快
<ul>
<li>周期性更新</li>
<li>根据链路代价的变化而变化</li>
</ul>
</li>
<li>自适应路由选择(adaptive algorithm)：能适应网络拓扑和通信量的变化</li>
</ul>
</li>
</ul>
<h3 id="链路状态算法（link-state，LS）">链路状态算法（link state，LS）</h3>
<p>链路状态算法就是著名的迪杰斯特拉(Dijkstra)算法。</p>
<p>配置LS路由选择算法的路由工作过程：</p>
<ul>
<li>
<p>各点通过各种渠道获得整个网络拓扑, 网络中所有链路代价等信息（这部分和算法没关系，属于协议和实现）</p>
</li>
<li>
<p>使用LS路由算法,计算本站点到其它站点的最优路径(汇集树),得到路由表</p>
</li>
<li>
<p>按照此路由表转发分组(datagram方式)【数据平面的工作】</p>
<ul>
<li>分发到输入端口的网络层（严格意义上说不是路由的一个步骤）</li>
</ul>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNLS%E7%AE%97%E6%B3%95%E6%B5%81%E7%A8%8B.png" alt=""></p>
</li>
</ul>
<h4 id="基本工作过程">基本工作过程</h4>
<p>链路状态（LS）路由的基本工作过程：</p>
<ol>
<li>
<p>发现相邻节点,获知对方网络地址</p>
<ul>
<li>一个路由器上电之后,向所有线路发送<code>HELLO</code>分组</li>
<li>其它路由器收到<code>HELLO</code>分组,回送应答,在应答分组中,告知自己的名字(全局唯一)</li>
<li>在LAN中,通过广播<code>HELLO</code>分组,获得其它路由器的信息,可以认为引入一个人工节点</li>
</ul>
</li>
<li>
<p>测量到相邻节点的代价(延迟,开销)</p>
<ul>
<li>实测法,发送一个分组要求对方立即响应</li>
<li>回送一个<code>ECHO</code>分组</li>
<li>通过测量时间可以估算出延迟情况</li>
</ul>
</li>
<li>
<p>组装一个链路状态（LS）分组,描述它到相邻节点的代价情况</p>
<ul>
<li>发送者名称</li>
<li>序号,年龄</li>
<li>列表: 给出它相邻节点,和它到相邻节点的延迟</li>
</ul>
</li>
<li>
<p>将分组通过扩散（泛洪）的方法发到所有其它路由器</p>
<ul>
<li>
<p>顺序号:用于控制无穷的扩散,每个路由器都记录(源路由器,顺序号),发现重复的或老的就不扩散（网络是一个环状的，不加以控制可以一直扩散下去，形成”广播风暴“，浪费了大量的资源，）</p>
<blockquote>
<p>具体问题：</p>
<ul>
<li>具体问题1: 循环使用问题</li>
<li>具体问题2: 路由器崩溃之后序号从0开始</li>
<li>具体问题3:序号出现错误</li>
</ul>
<p>解决方案：年龄字段(age)</p>
<ul>
<li>生成一个分组时,年龄字段不为0</li>
<li>每个一个时间段,AGE字段减1</li>
<li>AGE字段为0的分组将被抛弃</li>
</ul>
</blockquote>
</li>
<li>
<p>关于扩散分组的数据结构</p>
<ul>
<li>Source ：从哪个节点收到LS分组</li>
<li>Seq，Age：序号,年龄</li>
<li>Send flags：发送标记,必须向指定的哪些相邻站点转发LS分组</li>
<li>ACK flags：本站点必须向哪些相邻站点发送应答</li>
<li>DATA：来自source站点的LS分组</li>
</ul>
</li>
</ul>
<blockquote>
<p>以上4步让每个路由器获得拓扑和边代价</p>
</blockquote>
</li>
<li>
<p>通过Dijkstra算法找出最短路径（这才是路由算法）</p>
<ul>
<li>路由器获得各站点LS分组和整个网络的拓扑</li>
<li>通过Dijkstra算法计算出到其它各路由器的最短 路径(汇集树)
<ul>
<li>每个节点独立算出来到其他节点（路由器=网络）的最短路径</li>
<li>迭代算法：第k步能够知道本节点到k个其他节点的最短路径</li>
</ul>
</li>
<li>将计算结果安装到路由表中</li>
</ul>
</li>
</ol>
<h4 id="应用情况">应用情况</h4>
<p>链路状态的应用情况：</p>
<ul>
<li>OSPF协议是一种LS协议,被用于Internet上</li>
<li>IS-IS(intermediate system - intermediate system)：被用于Internet主干中, Netware</li>
</ul>
<h4 id="算法原理">算法原理</h4>
<p>符号标记：</p>
<ul>
<li>c(i,j)：从节点 i 到 j 链路代价（初始状态下非相邻节点之间的链路代价为∞）</li>
<li>D(v)：从源节点到节点V的当前路径代价（节点的代价）</li>
<li>P(v)：从源到节点V的路径前序节点</li>
<li>N’: 当前已经知道最优路径的的节点集合（永久节点的集合）</li>
</ul>
<p>节点标记：每一个节点使用(D(v),p(v))</p>
<blockquote>
<p>如： (3,B) 标记</p>
</blockquote>
<ul>
<li>D(v)从源节点由已知最优路径到达本节点的<strong>距离</strong></li>
<li>P(v)<strong>前序节点</strong>来标注</li>
</ul>
<p>两类节点：</p>
<ul>
<li>临时节点(tentative node)：还没有找到从源节点到此节点的最优路径的节点</li>
<li>永久节点(permanent node) <strong>N’</strong>：已经找到了从源节点到此节点的最优路径的节点</li>
</ul>
<p>流程：</p>
<ol>
<li>
<p>初始化</p>
<ul>
<li>除了源节点外,所有节点都为临时节点</li>
<li>节点代价除了与源节点代价相邻的节点外,都为∞</li>
</ul>
</li>
<li>
<p>从所有临时节点中找到一个节点代价最小的临时节点,将之变成永久节点（假设找到一个节点W）</p>
</li>
<li>
<p>对此节点的所有在临时节点集合中的邻节点，假设为节点V</p>
<ul>
<li>
<p>如 D(v) &gt; D(w) + c(w,v), 则重新标注此点, (D(W)+C(W,V), W)</p>
<blockquote>
<p>即源节点到V节点的距离又有最小值，则更新</p>
</blockquote>
</li>
<li>
<p>否则，不重新标注</p>
</li>
</ul>
</li>
<li>
<p>返回第2步，开始一个新的循环</p>
</li>
</ol>
<p>案例：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%BF%AA%E6%9D%B0%E6%96%AF%E7%89%B9%E6%8B%89%E7%AE%97%E6%B3%95%E6%A1%88%E4%BE%8B.png" alt=""></p>
<h4 id="Dijkstra算法的讨论">Dijkstra算法的讨论</h4>
<ul>
<li>
<p>算法复杂度: n节点</p>
<ul>
<li>每一次迭代: 需要检查所有不在永久集合N中节点</li>
<li>n(n+1)/2 次比较: O(n<sup>2</sup>)</li>
<li>有很有效的实现: O(nlogn)</li>
</ul>
</li>
<li>
<p>可能的震荡：</p>
<p>举例：如果链路代价 = 链路承载的流量（拥塞程度）：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E9%93%BE%E8%B7%AF%E5%8F%AF%E8%83%BD%E9%9C%87%E8%8D%A1.png" alt=""></p>
</li>
</ul>
<h3 id="距离矢量算法（distance-vector，DV）">距离矢量算法（distance vector，DV）</h3>
<ul>
<li>动态路由算法之一</li>
<li>DV算法历史及应用情况：
<ul>
<li>1957 Bellman, 1962 Ford Fulkerson</li>
<li>用于ARPANET, Internet(RIP) DECnet , Novell, ApplTalk</li>
</ul>
</li>
<li>距离矢量路由选择的基本思想
<ul>
<li>各路由器维护一张路由表</li>
<li>各路由器与相邻路由器交换路由表</li>
<li>根据获得的路由信息,更新路由表</li>
</ul>
</li>
</ul>
<p>如下图示例：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量路由选择示例.png" style="zoom: 67%;" />
<p>代价及相邻节点间代价的获得：</p>
<ul>
<li>跳数(hops), 延迟(delay),队列长度</li>
<li>相邻节点间代价的获得：通过实测</li>
</ul>
<p>路由信息的更新：</p>
<ul>
<li>根据实测 得到本节点A到相邻站点的代价（如:延迟）</li>
<li>根据各相邻站点声称它们到目标站点B的代价</li>
<li>计算出本站点A经过各相邻站点到目标站点B的代价</li>
<li>找到一个最小的代价，和相应的下一个节点Z，到达节点 B经过此节点Z，并且代价为A-Z-B的代价</li>
</ul>
<blockquote>
<p>其它所有的目标节点一个计算法</p>
</blockquote>
<h4 id="实例">实例</h4>
<p>如下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量路由案例一续改.png" style="zoom:80%;" />
<ul>
<li>以当前节点J为例,相邻节点 A,I,H,K</li>
<li>J测得到A,I,H,K的延迟为： 8ms,10ms,12ms,6ms</li>
<li>通过交换DV, 从A,I,H,K获得到它们到G的延迟为 18ms,31ms,6ms,31ms</li>
<li>因此从J经过A,I,H,K到G的延迟为26ms,41ms,18ms, 37ms</li>
<li>将到G的路由表项更新为18ms,下一跳为：H</li>
<li>其它目标一样，除了本节点J（分组从J到J当然为0）</li>
</ul>
<h4 id="贝尔曼-福特（Bellman-Ford-）方程">贝尔曼-福特（Bellman-Ford ）方程</h4>
<p>实际上距离矢量算法是基于<strong>贝尔曼-福特（Bellman-Ford ）方程</strong>（动态规划）。</p>
<ul>
<li>
<p>设：d<sub>x</sub> (y) = 从x到y的最小路径代价（x为源节点，y为目标节点）</p>
</li>
<li>
<p>则 d<sub>x</sub> (y) = min { c(x,v) + d<sub>v</sub> (y) }</p>
<blockquote>
<ul>
<li>min：取所有x的邻居取最小的v</li>
<li>c(x,v)：x到邻居v的代价</li>
<li>d<sub>v</sub> (y)：从邻居v到目标y的代价</li>
</ul>
</blockquote>
</li>
</ul>
<p>案例1：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B4%9D%E5%B0%94%E6%9B%BC%E7%A6%8F%E7%89%B9%E6%96%B9%E7%A8%8B%E6%A1%88%E4%BE%8B.png" alt=""></p>
<ul>
<li>
<p>明显：d<sub>v</sub> (z) = 5 , d<sub>x</sub> (z) = 3 , d<sub>w</sub> (z) = 3</p>
</li>
<li>
<p>由 B-F 方程得到：</p>
<p>d<sub>u</sub> (z) = min { c(u,v) + d<sub>v</sub> (z) ,  c(u,x) + d<sub>x</sub> (z) , c(u,w) + d<sub>w</sub> (z) } = { 2+5 , 1+3 , 5+3 } = 4</p>
</li>
</ul>
<p>核心思路：</p>
<ul>
<li>
<p>每个节点都将自己的距离矢量估计值传送给邻居，定时或者DV有变化时，让对方去算</p>
</li>
<li>
<p>当x从邻居收到DV时，自己运算，更新它自己的距离矢量（采用B-F equation）</p>
</li>
<li>
<p>D<sub>x</sub> (y)估计值最终收敛于实际的最小代价值d<sub>x</sub> (y)</p>
<blockquote>
<p>是迭代算法、分布式算法</p>
</blockquote>
</li>
</ul>
<p>异步式,迭代：每次本地迭代被以下事件触发：</p>
<ul>
<li>本地链路代价变化了</li>
<li>从邻居来了DV的更新消息</li>
</ul>
<p>分布式：</p>
<ul>
<li>每个节点只是在自己的DV改变之后向邻居通告</li>
<li>然后邻居们在有必要的时候通知他们的邻居</li>
</ul>
<p>每个节点的动作如下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量算法每个节点.png" style="zoom: 67%;" />
<p>案例2：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B4%9D%E5%B0%94%E6%9B%BC%E7%A6%8F%E7%89%B9%E6%96%B9%E7%A8%8B%E6%A1%88%E4%BE%8B2.png" alt=""></p>
<h4 id="DV的特点">DV的特点</h4>
<p>特点：</p>
<ul>
<li>
<p>好消息传的快</p>
<p>好消息的传播以每一个交换周期前进一个路由器的速度进行</p>
<p>举例：假设刚架设的路由节点A，它与B连通了</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDV%E5%A5%BD%E6%B6%88%E6%81%AF.png" alt=""></p>
<blockquote>
<ul>
<li>经过第一个周期，c(A,B) = 1</li>
<li>经过第二个周期，c(A,C) = 2</li>
<li>如此下去</li>
</ul>
</blockquote>
</li>
<li>
<p>坏消息传的慢（无穷计算问题）</p>
<p>举例：路由节点A刚刚撤销了</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDV%E5%9D%8F%E6%B6%88%E6%81%AF.png" alt=""></p>
<blockquote>
<ul>
<li>第一次交换之后, B从C处获得信息,C可以到达A(C-A,但是要经过B本身),但是路径是2,因此B变成3,从C处走</li>
<li>第二次交换,C从B处获得消息, B可以到达A,路径为3, 因此,C到A从B走,代价为4</li>
<li>形成了一个环路</li>
<li>无限次循环下去，到A的距离就变成了∞（不可达）</li>
</ul>
</blockquote>
</li>
</ul>
<p>实际上有一种缓解环路（无穷计算）的情况，即水平分裂(split horizon)算法。</p>
<h4 id="水平分裂-split-horizon-算法">水平分裂(split horizon)算法</h4>
<blockquote>
<p>注：有些教材也解释为“毒性逆转”。</p>
</blockquote>
<p>一种对无穷计算问题的解决办法：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E6%B0%B4%E5%B9%B3%E5%88%86%E8%A3%82%E7%AE%97%E6%B3%95%E4%B8%BE%E4%BE%8B.png" alt=""></p>
<ul>
<li>
<p>假设节点B直达A，C到A依赖于B，D到A依赖于B，C</p>
</li>
<li>
<p>现在突然A节点不可达</p>
</li>
<li>
<p>C知道要经过B才能到达A，所以C向B报告它到A的距离为∞（虚假信息）；但是C告诉D它到A的真实距离</p>
</li>
<li>
<p>同样的，D告诉C它通向A的距离为∞（虚假信息），但是D告诉E它到A的真实距离</p>
<blockquote>
<p>“左向虚假，右向真实”</p>
</blockquote>
</li>
<li>
<p>这样在第一次交换的时候，B通过测试发现到A的路径为∞，而C也告诉B到A的距离为∞，因此B到A的距离为∞</p>
</li>
<li>
<p>在第二次交换的时候，C从B和D那里获知,到A的距离为∞，因此C到A的距离为∞</p>
</li>
<li>
<p>如此，坏消息也同样以一次交换一个节点的速度传播</p>
</li>
</ul>
<p>值得注意的是，水平分裂算法在某些拓扑形式下会失败（存在环路），分析下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN水平分裂算法问题.png" style="zoom: 67%;" />
<ul>
<li>A,B到D的距离为2, C到D的距离为1</li>
<li>现在假设C-D通路销毁</li>
<li>C获知到D的距离为∞，从A,B获知到D的距离为∞，因此C认为D不可达</li>
<li>A从C获知D的距离为∞，但从B处获知它到D的距离为2，因此A到B的距离为3，从B走</li>
<li>B也有类似的问题</li>
<li>经过无限次之后，A和B都知道到D的距离为∞</li>
</ul>
<h3 id="LS-和-DV-算法的比较">LS 和 DV 算法的比较</h3>
<p>下面我们来分析链路状态算法和距离矢量算法的差别：</p>
<ul>
<li>
<p>消息复杂度</p>
<ul>
<li>LS: 有 n 节点, E 条链路,发送 报文O(nE)个
<ul>
<li>局部的路由信息；全局传播</li>
</ul>
</li>
<li>只和邻居交换信息
<ul>
<li>全局的路由信息，局部传播</li>
</ul>
</li>
<li>距离矢量算法更优</li>
</ul>
</li>
<li>
<p>收敛时间</p>
<ul>
<li>LS：O(n<sup>2</sup>) 算法
<ul>
<li>有可能震荡</li>
</ul>
</li>
<li>DV: 收敛较慢
<ul>
<li>可能存在路由环路（无限循环问题）</li>
</ul>
</li>
<li>链路状态算法更优</li>
</ul>
</li>
<li>
<p>健壮性：如果路由器故障会发生什么</p>
<ul>
<li>
<p>LS：</p>
<ul>
<li>节点会通告不正确的链路代价</li>
<li>每个节点只计算自己的路由表</li>
<li>错误信息影响较小，局部，路由较健壮</li>
</ul>
</li>
<li>
<p>DV：</p>
<ul>
<li>
<p>DV 节点可能通告对全网所有节点的不正确路径代价</p>
</li>
<li>
<p>每一个节点的路由表可能被其它节点使用</p>
<blockquote>
<p>假如一个节点出现错误，通告全网到此路由的代价为0，那么全网的所有分组就都会涌向此节点</p>
</blockquote>
</li>
<li>
<p>错误可以扩散到全网</p>
</li>
</ul>
</li>
<li>
<p>链路状态算法更优</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>两种路由选择算法都有其优缺点，而且在互联网上都有应用。</p>
</blockquote>
<h2 id="因特网中自治系统（AS）内部的路由选择">因特网中自治系统（AS）内部的路由选择</h2>
<h3 id="路由选择信息协议（Routing-Information-Protocol，RIP）">路由选择信息协议（Routing Information Protocol，RIP）</h3>
<ul>
<li>
<p>在 1982年发布的BSD-UNIX 中实现</p>
</li>
<li>
<p>基于距离矢量算法：</p>
<ul>
<li>
<p>距离矢量：每条链路cost = 1，</p>
<p>代价就是跳数 (max = 15 hops，16代表目标不可达)</p>
</li>
<li>
<p>约定V每隔30秒和邻居交换距离矢量（DV），通告</p>
<ul>
<li>情况一：定期30秒，而且在改变路由的时候发送通告报文</li>
<li>情况二：在对方的请求下也可以发送通告报文</li>
</ul>
</li>
<li>
<p>每个通告包括：最多25个目标子网</p>
<ul>
<li>内容：目标网络 + 跳数（最大跳数为16，表示不可达）</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>下图是一个RIP协议的实例：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP案例.png" style="zoom: 67%;" />
<p>如果此时，节点A发送给D新的距离矢量，告知A到Z的跳数为4，那么D的距离矢量就会更新，如下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP案例续.png" style="zoom: 67%;" />
<h4 id="链路失效和恢复">链路失效和恢复</h4>
<p>如果180秒（6个周期）没有收到通告信息，则表示邻居或者链路失效</p>
<ul>
<li>发现经过这个邻居的路由已失效</li>
<li>新的通告报文会传递给邻居</li>
<li>邻居因此发出新的通告 (如果路由变化的话)</li>
<li>使用毒性逆转（poison reverse）/水平分裂算法，阻止ping-pong回路 ( 不可达的距离：跳数无限 = 16 段)</li>
</ul>
<h4 id="RIP-进程处理">RIP 进程处理</h4>
<ul>
<li>
<p>RIP 以应用进程的方式实现：route-d (daemon)</p>
</li>
<li>
<p>通告报文通过UDP报文传送，周期性重复</p>
</li>
<li>
<p>网络层的协议使用了传输层的服务，以应用层实体的方式实现</p>
<blockquote>
<p>这一点很有趣，网络层的功能以应用进程的形式来实现，为了实现这个功能，还要借助传输层来传输距离矢量DV</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%BE%9D%E8%B5%96.png" alt=""></p>
</blockquote>
</li>
</ul>
<h3 id="开放最短路优先（Open-Shortest-Path-First，OSFP）">开放最短路优先（Open Shortest Path First，OSFP）</h3>
<ul>
<li>
<p>“open”：标准可公开获得</p>
</li>
<li>
<p>使用链路状态算法：</p>
<ul>
<li>LS 分组在网络中（一个AS内部）分发</li>
<li>全局网络拓扑、代价在每一个节点中都保持</li>
<li>路由计算采用Dijkstra算法</li>
</ul>
</li>
<li>
<p>OSPF通告信息中携带：每一个邻居路由器一个表项</p>
<blockquote>
<p>“我是谁”，传输的链路状态分组是第几个版本，TTL</p>
<p>“我有哪些邻居，我到邻居的代价是多少”</p>
</blockquote>
</li>
<li>
<p>通告信息会传遍AS全部（通过泛洪）</p>
<ul>
<li>在IP数据报上直接传送OSPF报文 (而不是通过UDP和TCP)</li>
</ul>
</li>
<li>
<p>IS-IS路由协议：几乎和OSPF一样</p>
</li>
</ul>
<h4 id="OSPF高级特性">OSPF高级特性</h4>
<p>这些特性是在RIP中所没有的。</p>
<ul>
<li>
<p>安全: 所有的OSPF报文都是经过认证的 (防止恶意的攻击)</p>
</li>
<li>
<p>允许有多个代价相同的路径存在 (在RIP协议中只有一个)</p>
<blockquote>
<p>可以在代价相同的节点作“负载均衡”。</p>
</blockquote>
</li>
<li>
<p>对于每一个链路，对于不同的TOS有多重代价矩阵</p>
<blockquote>
<p>例如：卫星链路代价对于尽力而为的服务代价设置比较低，对实时服务代价设置的比较高</p>
<p>支持按照不同的代价计算最优路径，如：按照时间和延迟分别计算最优路径</p>
</blockquote>
</li>
<li>
<p>对单播和多播的集成支持：</p>
<ul>
<li>Multicast OSPF (MOSPF) 使用相同的拓扑数据库，就像在OSPF中一样</li>
</ul>
</li>
<li>
<p>在大型网络中支持<code>层次性OSPF</code></p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN层次化OSPF路由.png" style="zoom: 67%;" />
<blockquote>
<p>如果网络比较大，可以把自治区域划分成：骨干区域（backbone）、区域一、区域二…</p>
<p>不同的小区域之间的分组转发都需要借助区域边界路由器（area border routers），先将其路由至骨干区域。</p>
<p>泛洪仅在小区域内部进行。</p>
<p>分组的传递过程：小区域 →（通过区域边界路由器）→ 骨干区域 →（通过边界路由器）→ 传送到其他子网（依然通过另一个子网的骨干区域到达小区域）</p>
</blockquote>
</li>
</ul>
<p>层次性的OSPF路由：</p>
<ul>
<li>
<p>两个级别的层次性: 本地, 骨干</p>
<ul>
<li>
<p>链路状态通告仅仅在本地区域Area范围内进行</p>
</li>
<li>
<p>每一个节点拥有本地区域的拓扑信息</p>
<blockquote>
<p>关于其他区域，知道去它的方向，通过区域边界路由器（最短路径）</p>
</blockquote>
</li>
</ul>
</li>
<li>
<p>区域边界路由器: “汇总（聚集）”到自己区域内网络的距离, 向其它区域边界路由器通告</p>
<blockquote>
<p>同时参与了两个区域的路由计算</p>
</blockquote>
</li>
<li>
<p>骨干路由器: 仅仅在骨干区域内，运行OSPF路由</p>
</li>
<li>
<p>边界路由器: 连接其它的自治系统（AS’s）</p>
</li>
</ul>
<blockquote>
<p>小结一下：</p>
<p>如果</p>
</blockquote>
<h2 id="ISP之间的路由选择">ISP之间的路由选择</h2>
<h3 id="一个平面的路由">一个平面的路由</h3>
<ul>
<li>一个网络中的所有路由器的地位一样</li>
<li>通过LS, DV，或者其他路由算法，所有路由器都要知道其他所有路由器（子网）如何走</li>
<li>所有路由器在一个平面</li>
<li>平面路由的问题：
<ul>
<li>规模巨大的网络中，路由信息的存储、传输和计算代价巨大：
<ul>
<li>DV: 距离矢量很大，且不能够收敛</li>
<li>LS：几百万个节点的LS分组的泛洪传输，存储以及最短路径算法的计算</li>
</ul>
</li>
<li>管理问题：
<ul>
<li>不同的网络所有者希望按照自己的方式管理网络</li>
<li>一方面希望对外隐藏自己网络的细节</li>
<li>当然，还希望和其它网络互联</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>一个平面的路由面临计算成本的高昂代价以及管理问题，为此出现了一个解决方案：层次路由。</p>
<h3 id="层次路由">层次路由</h3>
<blockquote>
<p>将互联网中的路由问题分为两个层面（按照物理分布范围）：</p>
<ul>
<li>自治区域内</li>
<li>自治区域间</li>
</ul>
</blockquote>
<ul>
<li>
<p>层次路由：将互联网分成一个个自治区域AS(路由器区域)</p>
<ul>
<li>某个区域内的路由器集合，自治系统（autonomous systems ，AS)</li>
<li>一个AS用 <code>AS Number（ASN)</code>唯一标示</li>
<li>一个ISP可能包括一个或者多个AS</li>
</ul>
</li>
<li>
<p>路由变成了两个层次的路由：</p>
<ul>
<li>AS内部路由：在同一个AS内路由器运行相同的路由协议
<ul>
<li><strong>intra-AS routing protocol：内部网关协议</strong></li>
<li>不同的AS可能运行着不同的内部网关协议（如：LS，DV）</li>
<li>能够解决规模和管理问题</li>
<li>如：RIP,OSPF,IGRP</li>
<li>网关路由器：AS边缘路由器，可以连接到其他AS</li>
</ul>
</li>
<li>AS间运行AS间路由协议
<ul>
<li><strong>inter-AS routing protocol：外部网关协议</strong></li>
<li>解决AS之间的路由问题，完成AS之间的互联互通</li>
</ul>
</li>
</ul>
</li>
<li>
<p>层次路由的优点：</p>
<ul>
<li>
<p>解决了规模问题：</p>
<ul>
<li>
<p>内部网关协议解决：AS内部数量有限的路由器相互到达的问题, AS内部规模可控</p>
<blockquote>
<p>如果AS节点太多，可继续分割AS，使得AS内部的节点数量有限</p>
</blockquote>
</li>
<li>
<p>AS之间的路由的规模问题：</p>
<ul>
<li>增加一个AS，对于AS之间的路由从总体上来说，只是增加了一个节点=子网（每个AS可以用一个点来表示）</li>
<li>对于其他AS来说只是增加了一 个表项，就是这个新增的AS如何走的问题</li>
<li>扩展性强：规模增大，性能不会减得太多</li>
</ul>
</li>
</ul>
</li>
<li>
<p>解决了管理问题：</p>
<ul>
<li>各个AS可以运行不同的内部网关协议</li>
<li>可以使自己网络的细节不向外透露，增加安全性</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="边界网关协议（Border-Gateway-Protocol，BGP）">边界网关协议（Border Gateway Protocol，BGP）</h3>
<ul>
<li>
<p>BGP (Border Gateway Protocol): 自治区域间路由协议“事实上的”标准</p>
<blockquote>
<p>将互联网各个AS粘在一起的胶水</p>
</blockquote>
</li>
<li>
<p>BGP 提供给每个AS以以下方法：</p>
<ul>
<li>
<p>eBGP: 从相邻的ASes那里获得子网可达信息（外部）</p>
</li>
<li>
<p>iBGP: 将获得的子网可达信息传遍到AS内部的所有路由器（内部）</p>
</li>
<li>
<p>根据子网可达信息和策略来决定到达子网的“最优”路径</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP连接.png" style="zoom: 67%;" />
</li>
</ul>
</li>
<li>
<p>允许子网向互联网其他网络通告“我在这里”</p>
</li>
<li>
<p>基于距离矢量算法（路径矢量）</p>
<ul>
<li>这是一种“改进”后的距离矢量</li>
<li>不仅仅是距离矢量，还包括到达各个目标网络的详细路径（AS序号的列表）能够避免简单DV算法的路由环路问题</li>
</ul>
</li>
</ul>
<h4 id="BGP会话">BGP会话</h4>
<ul>
<li>
<p>BGP 会话: 两个BGP路由器(“peers”)在一个半永久的TCP连接上 交换BGP报文（包括子网可达信息）:</p>
<ul>
<li>通告向不同目标子网前缀的“路径”（BGP是一个“路径矢量”协议）</li>
</ul>
</li>
<li>
<p>当AS3中新增了X节点（如下图）：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%BF%9E%E6%8E%A52.png" alt=""></p>
<p>当AS3网关路由器3a向AS2的网关路由器2c通告路径： AS3,X</p>
<ul>
<li>3a参与AS内路由运算，知道本AS所有子网X信息</li>
<li>语义上：AS3向AS2承诺，它可以向子网X转发数据报</li>
<li>3a是2c关于X的下一跳（next hop）</li>
</ul>
</li>
</ul>
<p>路径的属性：</p>
<ul>
<li>当通告一个子网前缀时，通告包括 BGP 属性：
<ul>
<li>prefix + attributes = “route”</li>
</ul>
</li>
<li>两个重要的属性：
<ul>
<li><strong>AS-PATH</strong>: 前缀的通告所经过的AS列表: AS 67、AS 17
<ul>
<li>检测环路；多路径选择</li>
<li>在向其它AS转发时，需要将自己的AS号加在路径上</li>
</ul>
</li>
<li><strong>NEXT-HOP</strong>: 从当前AS到下一跳AS有多个链路，在NETX-HOP属性中，告诉对方通过那个 链路转发</li>
<li>其它属性：路由偏好指标，如何被插入的属性</li>
</ul>
</li>
</ul>
<p>BGP是基于策略的路由：</p>
<ul>
<li>当一个网关路由器接收到了一个路由通告, 使用<strong>输入策略</strong>来接受或过滤（accept / decline）
<ul>
<li>过滤原因例1：不想经过某个AS，转发某些前缀的分组</li>
<li>过滤原因例2：已经有了一条往某前缀的偏好路径</li>
</ul>
</li>
<li>策略也决定了是否向它别的邻居通告收到的这个路由信息</li>
</ul>
<h4 id="BGP路径通告">BGP路径通告</h4>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A.png" alt=""></p>
<ul>
<li>
<p>路由器AS2.2c从AS3.3a接收到的AS3,X路由通告 (通过eBGP)</p>
</li>
<li>
<p>基于AS2的输入策略，AS2.2c决定接收AS3,X的通告，而且通过iBGP（TCP连接）向AS2的所有路由器进行通告</p>
</li>
<li>
<p>基于AS2的策略，AS2路由器2a通过eBGP向AS1.1c路由器通告 AS2,AS3,X 路由信息</p>
<blockquote>
<p>路径上加上了 AS2自己作为AS序列的一跳</p>
</blockquote>
</li>
</ul>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A2.png" alt=""></p>
<p>网关路由器可能获取有关一个子网X的多条路径，从多个eBGP 会话上：</p>
<ul>
<li>
<p>AS1 网关路由器1c从2a学习到路径：<code>AS2,AS3,X</code></p>
</li>
<li>
<p>AS1网关路由器1c从3a处学习到路径：<code>AS3,X</code></p>
</li>
<li>
<p>基于策略，AS1路由器1c选择了路径：<code>AS3,X</code>，而且通过iBGP告诉所有AS1内部的路由器</p>
<blockquote>
<p>不一定跳数少即判定为代价小，要基于策略的判断</p>
<p>有政治策略（例如：敌对公司）、经济策略等</p>
</blockquote>
</li>
</ul>
<h4 id="BGP报文">BGP报文</h4>
<ul>
<li>
<p>使用TCP协议交换BGP报文</p>
</li>
<li>
<p>BGP 报文：</p>
<p><code>OPEN</code>：打开TCP连接，认证发送方</p>
<p><code>UPDATE</code>：通告新路径 (或者撤销原路径)</p>
<p><code>KEEPALIVE</code>：在没有更新时保持连接，也用于对 OPEN 请求确认</p>
<p><code>NOTIFICATION</code>：报告以前消息的错误，也用来关闭连接</p>
</li>
</ul>
<p>问题：一个自治区域（AS1）中的普通路由器如何才能将分组传递到另一个自治区域（AS2）内的路由器？</p>
<p>区域边界路由器可以通过外部网关协议获知AS2中路由器的存在，并通过内部网关协议通告AS1中所有的路由器。</p>
<h4 id="BGP-路径选择">BGP 路径选择</h4>
<ul>
<li>路由器可能获得一个网络前缀的多个路径，路由器必须进行路径的选择，路由选择可以基于：
<ul>
<li>本地偏好值属性: 偏好策略决定</li>
<li>最短AS-PATH：AS的跳数</li>
<li>最近的NEXT-HOP路由器：热土豆路由（给最近的）</li>
<li>附加的判据：使用BGP标示</li>
</ul>
</li>
<li>一个前缀对应着多种路径，采用消除规则直到留下一条路径</li>
</ul>
<h4 id="热土豆路由">热土豆路由</h4>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E7%83%AD%E5%9C%9F%E8%B1%86%E8%B7%AF%E7%94%B1.png" alt=""></p>
<ul>
<li>2d通过iBGP获知，它可以通过2a或者2c到达X</li>
<li>热土豆策略：选择具备最小内部区域代价的网关作为往X的出口（如：2d选择2a，即使往X可能有比较多的AS跳数）：<strong>不要操心域间的代价</strong></li>
</ul>
<h3 id="内部网关协议与外部网关协议的不同">内部网关协议与外部网关协议的不同</h3>
<ul>
<li>策略：
<ul>
<li>Inter-AS: 管理员需要控制通信路径，谁在使用它的网络进行数据传输</li>
<li>Intra-AS: 一个管理者，所以无需策略
<ul>
<li>AS内部的各子网的主机尽可能地利用资源进行快速路由</li>
</ul>
</li>
</ul>
</li>
<li>规模：
<ul>
<li>AS间路由必须考虑规模问题，以便支持全网的数据转发</li>
<li>AS内部路由规模不是一个大的问题
<ul>
<li>如果AS 太大，可将此AS分成小的AS；规模可控</li>
<li>AS之间只不过多了一个点而已</li>
<li>或者AS内部路由支持层次性，层次性路由节约了表空间, 降低了更新的数据流量</li>
</ul>
</li>
</ul>
</li>
<li>性能：
<ul>
<li>Intra-AS: 关注性能</li>
<li>Inter-AS: 策略可能比性能更重要</li>
</ul>
</li>
</ul>
<hr>
<h1>后记</h1>
<p>本篇已完结</p>
<p>（如有补充或错误，欢迎评论区留言）</p>
</article><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></div><div class="post_share"><div class="social-share" data-image="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/ComputerNetworksCover.jpg" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/social-share.js/dist/css/share.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/social-share.js/dist/js/social-share.min.js" defer></script></div></div><div class="post-reward"><div class="reward-button button--animated"><i class="fas fa-qrcode"></i> 打赏</div><div class="reward-main"><ul class="reward-all"><li class="reward-item"><a href="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/wechat.png" rel="external nofollow noreferrer" target="_blank"><img class="post-qr-code-img" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/wechat.png" alt="微信"/></a><div class="post-qr-code-desc">微信</div></li><li class="reward-item"><a href="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/alipay.jpg" rel="external nofollow noreferrer" target="_blank"><img class="post-qr-code-img" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/alipay.jpg" alt="支付宝"/></a><div class="post-qr-code-desc">支付宝</div></li></ul></div></div><div class="relatedPosts"><div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span> 相关推荐</span></div><div class="relatedPosts-list"><div><a href="/2021/07/15/计算机网络/计算机网络学习笔记-链路层/" title="计算机网络学习笔记-链路层"><img class="cover" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/ComputerNetworksCover.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2021-07-15</div><div class="title">计算机网络学习笔记-链路层</div></div></a></div><div><a href="/2021/03/28/计算机网络/计算机网络学习笔记/" title="计算机网络学习笔记"><img class="cover" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/RotatingImage3.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2021-03-28</div><div class="title">计算机网络学习笔记</div></div></a></div><div><a href="/2021/05/10/计算机网络/计算机网络学习笔记-传输层/" title="计算机网络学习笔记-传输层"><img class="cover" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/ComputerNetworksCover.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2021-05-10</div><div class="title">计算机网络学习笔记-传输层</div></div></a></div><div><a href="/2021/03/09/计算机网络/计算机网络学习笔记-计算机网络概述/" title="计算机网络学习笔记--计算机网络概述"><img class="cover" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/ComputerNetworksCover.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2021-03-09</div><div class="title">计算机网络学习笔记--计算机网络概述</div></div></a></div><div><a href="/2021/04/05/计算机网络/计算机网络学习笔记-应用层/" title="计算机网络学习笔记-应用层"><img class="cover" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/ComputerNetworksCover.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2021-04-05</div><div class="title">计算机网络学习笔记-应用层</div></div></a></div></div></div><hr/><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i><span> 评论</span></div><div id="comment-switch"><span class="first-comment">Twikoo</span><span class="switch-btn"></span><span class="second-comment">Valine</span></div></div><div class="comment-wrap"><div><div id="twikoo-wrap"></div></div><div><div class="vcomment" id="vcomment"></div></div></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="card-info-avatar is-center"><img class="avatar-img" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/><div class="author-info__name">花猪</div><div class="author-info__description">此站点就暂时停留在秋天了吧</div></div><div class="card-info-data"><div class="card-info-data-item is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">86</div></a></div><div class="card-info-data-item is-center"><a href="/tags/"><div class="headline">标签</div><div class="length-num">20</div></a></div><div class="card-info-data-item is-center"><a href="/categories/"><div class="headline">分类</div><div class="length-num">10</div></a></div></div><a class="button--animated" id="card-info-btn" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/CNhuazhu"><i class="fab fa-github"></i><span>我的github</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/CNhuazhu" rel="external nofollow noreferrer" target="_blank" title="Github"><i class="fab fa-github"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn card-announcement-animation"></i><span>公告</span></div><div class="announcement_content">花猪在此欢迎您光临小破站 (՞•Ꙫ•՞) <br><b>此站点已暂停更新！！！！</b><br><br>  <b><i>本站已部署至云服务器👇</i></b>：<a href="http://cnhuazhu.top">http://cnhuazhu.top</a> <br><br>  <b><i>github地址（暂停更新）</i></b>：<a target="_blank" rel="noopener external nofollow noreferrer" href="https://cnhuazhu.github.io/">https://cnhuazhu.github.io/</a> <br> <b><i>码云地址（暂停更新）</i></b>：<a target="_blank" rel="noopener external nofollow noreferrer" href="https://cnhuazhu.gitee.io">https://cnhuazhu.gitee.io</a> <br><br>  本站主题：Butterfly 3.7.8 <br> <img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/pig.gif"></div><timing></timing></div><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link"><span class="toc-number">1.</span> <span class="toc-text">前言</span></a></li><li class="toc-item toc-level-1"><a class="toc-link"><span class="toc-number">2.</span> <span class="toc-text">第四章：网络层</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%AF%BC%E8%AE%BA"><span class="toc-number">2.1.</span> <span class="toc-text">导论</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E5%B9%B3%E9%9D%A2%E4%B8%8E%E6%8E%A7%E5%88%B6%E5%B9%B3%E9%9D%A2"><span class="toc-number">2.1.1.</span> <span class="toc-text">数据平面与控制平面</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9E%8B"><span class="toc-number">2.1.2.</span> <span class="toc-text">网络服务模型</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%99%9A%E7%94%B5%E8%B7%AF%E5%92%8C%E6%95%B0%E6%8D%AE%E6%8A%A5%E7%BD%91%E7%BB%9C"><span class="toc-number">2.2.</span> <span class="toc-text">虚电路和数据报网络</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%99%9A%E7%94%B5%E8%B7%AF%E7%BD%91%E7%BB%9C"><span class="toc-number">2.2.1.</span> <span class="toc-text">虚电路网络</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E7%BB%84%E6%88%90"><span class="toc-number">2.3.</span> <span class="toc-text">路由器的组成</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3"><span class="toc-number">2.3.1.</span> <span class="toc-text">输入端口</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BA%A4%E6%8D%A2%E7%BB%93%E6%9E%84"><span class="toc-number">2.3.2.</span> <span class="toc-text">交换结构</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3"><span class="toc-number">2.3.3.</span> <span class="toc-text">输出端口</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%B0%83%E5%BA%A6%E6%9C%BA%E5%88%B6"><span class="toc-number">2.3.4.</span> <span class="toc-text">调度机制</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#IP%E5%8D%8F%E8%AE%AE%EF%BC%88Internet-Protocol%EF%BC%89"><span class="toc-number">2.4.</span> <span class="toc-text">IP协议（Internet Protocol）</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#IP%E6%95%B0%E6%8D%AE%E6%8A%A5%E6%A0%BC%E5%BC%8F"><span class="toc-number">2.4.1.</span> <span class="toc-text">IP数据报格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#IP-%E5%88%86%E7%89%87%E5%92%8C%E9%87%8D%E7%BB%84"><span class="toc-number">2.4.2.</span> <span class="toc-text">IP 分片和重组</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#IPv4"><span class="toc-number">2.4.3.</span> <span class="toc-text">IPv4</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#IP%E7%BC%96%E5%9D%80"><span class="toc-number">2.4.3.1.</span> <span class="toc-text">IP编址</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%AD%90%E7%BD%91%EF%BC%88Subnets-%EF%BC%89"><span class="toc-number">2.4.3.2.</span> <span class="toc-text">子网（Subnets)）</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#IP%E5%9C%B0%E5%9D%80%E5%88%86%E7%B1%BB"><span class="toc-number">2.4.3.3.</span> <span class="toc-text">IP地址分类</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E6%97%A0%E7%B1%BB%E5%9F%9F%E9%97%B4%E8%B7%AF%E7%94%B1%EF%BC%88CIDR%EF%BC%89"><span class="toc-number">2.4.3.4.</span> <span class="toc-text">无类域间路由（CIDR）</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#NAT%EF%BC%88Network-Address-Translation%EF%BC%89"><span class="toc-number">2.4.4.</span> <span class="toc-text">NAT（Network Address Translation）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#ICMP"><span class="toc-number">2.4.5.</span> <span class="toc-text">ICMP</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#Traceroute"><span class="toc-number">2.4.5.1.</span> <span class="toc-text">Traceroute</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#IPv6"><span class="toc-number">2.4.6.</span> <span class="toc-text">IPv6</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9%E7%AE%97%E6%B3%95"><span class="toc-number">2.5.</span> <span class="toc-text">路由选择算法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%B7%AF%E7%94%B1%EF%BC%88route%EF%BC%89"><span class="toc-number">2.5.1.</span> <span class="toc-text">路由（route）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%93%BE%E8%B7%AF%E7%8A%B6%E6%80%81%E7%AE%97%E6%B3%95%EF%BC%88link-state%EF%BC%8CLS%EF%BC%89"><span class="toc-number">2.5.2.</span> <span class="toc-text">链路状态算法（link state，LS）</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%9F%BA%E6%9C%AC%E5%B7%A5%E4%BD%9C%E8%BF%87%E7%A8%8B"><span class="toc-number">2.5.2.1.</span> <span class="toc-text">基本工作过程</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%BA%94%E7%94%A8%E6%83%85%E5%86%B5"><span class="toc-number">2.5.2.2.</span> <span class="toc-text">应用情况</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86"><span class="toc-number">2.5.2.3.</span> <span class="toc-text">算法原理</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Dijkstra%E7%AE%97%E6%B3%95%E7%9A%84%E8%AE%A8%E8%AE%BA"><span class="toc-number">2.5.2.4.</span> <span class="toc-text">Dijkstra算法的讨论</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%B7%9D%E7%A6%BB%E7%9F%A2%E9%87%8F%E7%AE%97%E6%B3%95%EF%BC%88distance-vector%EF%BC%8CDV%EF%BC%89"><span class="toc-number">2.5.3.</span> <span class="toc-text">距离矢量算法（distance vector，DV）</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%AE%9E%E4%BE%8B"><span class="toc-number">2.5.3.1.</span> <span class="toc-text">实例</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E8%B4%9D%E5%B0%94%E6%9B%BC-%E7%A6%8F%E7%89%B9%EF%BC%88Bellman-Ford-%EF%BC%89%E6%96%B9%E7%A8%8B"><span class="toc-number">2.5.3.2.</span> <span class="toc-text">贝尔曼-福特（Bellman-Ford ）方程</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#DV%E7%9A%84%E7%89%B9%E7%82%B9"><span class="toc-number">2.5.3.3.</span> <span class="toc-text">DV的特点</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E6%B0%B4%E5%B9%B3%E5%88%86%E8%A3%82-split-horizon-%E7%AE%97%E6%B3%95"><span class="toc-number">2.5.3.4.</span> <span class="toc-text">水平分裂(split horizon)算法</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#LS-%E5%92%8C-DV-%E7%AE%97%E6%B3%95%E7%9A%84%E6%AF%94%E8%BE%83"><span class="toc-number">2.5.4.</span> <span class="toc-text">LS 和 DV 算法的比较</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%A0%E7%89%B9%E7%BD%91%E4%B8%AD%E8%87%AA%E6%B2%BB%E7%B3%BB%E7%BB%9F%EF%BC%88AS%EF%BC%89%E5%86%85%E9%83%A8%E7%9A%84%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9"><span class="toc-number">2.6.</span> <span class="toc-text">因特网中自治系统（AS）内部的路由选择</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9%E4%BF%A1%E6%81%AF%E5%8D%8F%E8%AE%AE%EF%BC%88Routing-Information-Protocol%EF%BC%8CRIP%EF%BC%89"><span class="toc-number">2.6.1.</span> <span class="toc-text">路由选择信息协议（Routing Information Protocol，RIP）</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E9%93%BE%E8%B7%AF%E5%A4%B1%E6%95%88%E5%92%8C%E6%81%A2%E5%A4%8D"><span class="toc-number">2.6.1.1.</span> <span class="toc-text">链路失效和恢复</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#RIP-%E8%BF%9B%E7%A8%8B%E5%A4%84%E7%90%86"><span class="toc-number">2.6.1.2.</span> <span class="toc-text">RIP 进程处理</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%BC%80%E6%94%BE%E6%9C%80%E7%9F%AD%E8%B7%AF%E4%BC%98%E5%85%88%EF%BC%88Open-Shortest-Path-First%EF%BC%8COSFP%EF%BC%89"><span class="toc-number">2.6.2.</span> <span class="toc-text">开放最短路优先（Open Shortest Path First，OSFP）</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#OSPF%E9%AB%98%E7%BA%A7%E7%89%B9%E6%80%A7"><span class="toc-number">2.6.2.1.</span> <span class="toc-text">OSPF高级特性</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#ISP%E4%B9%8B%E9%97%B4%E7%9A%84%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9"><span class="toc-number">2.7.</span> <span class="toc-text">ISP之间的路由选择</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%B8%80%E4%B8%AA%E5%B9%B3%E9%9D%A2%E7%9A%84%E8%B7%AF%E7%94%B1"><span class="toc-number">2.7.1.</span> <span class="toc-text">一个平面的路由</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B1%82%E6%AC%A1%E8%B7%AF%E7%94%B1"><span class="toc-number">2.7.2.</span> <span class="toc-text">层次路由</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BE%B9%E7%95%8C%E7%BD%91%E5%85%B3%E5%8D%8F%E8%AE%AE%EF%BC%88Border-Gateway-Protocol%EF%BC%8CBGP%EF%BC%89"><span class="toc-number">2.7.3.</span> <span class="toc-text">边界网关协议（Border Gateway Protocol，BGP）</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#BGP%E4%BC%9A%E8%AF%9D"><span class="toc-number">2.7.3.1.</span> <span class="toc-text">BGP会话</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#BGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A"><span class="toc-number">2.7.3.2.</span> <span class="toc-text">BGP路径通告</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#BGP%E6%8A%A5%E6%96%87"><span class="toc-number">2.7.3.3.</span> <span class="toc-text">BGP报文</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#BGP-%E8%B7%AF%E5%BE%84%E9%80%89%E6%8B%A9"><span class="toc-number">2.7.3.4.</span> <span class="toc-text">BGP 路径选择</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E7%83%AD%E5%9C%9F%E8%B1%86%E8%B7%AF%E7%94%B1"><span class="toc-number">2.7.3.5.</span> <span class="toc-text">热土豆路由</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%86%85%E9%83%A8%E7%BD%91%E5%85%B3%E5%8D%8F%E8%AE%AE%E4%B8%8E%E5%A4%96%E9%83%A8%E7%BD%91%E5%85%B3%E5%8D%8F%E8%AE%AE%E7%9A%84%E4%B8%8D%E5%90%8C"><span class="toc-number">2.7.4.</span> <span class="toc-text">内部网关协议与外部网关协议的不同</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link"><span class="toc-number">3.</span> <span class="toc-text">后记</span></a></li></ol></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2021/11/02/NodeJS/%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAexpress%E6%9C%8D%E5%8A%A1%E5%99%A8/" title="快速搭建一个express服务器"><img src="https://gitee.com/CNhuazhu/tu-chuang1/raw/master/img-blog/Node_Express_cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="快速搭建一个express服务器"/></a><div class="content"><a class="title" href="/2021/11/02/NodeJS/%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAexpress%E6%9C%8D%E5%8A%A1%E5%99%A8/" title="快速搭建一个express服务器">快速搭建一个express服务器</a><time datetime="2021-11-02T00:39:53.000Z" title="发表于 2021-11-02 08:39:53">2021-11-02</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2021/10/28/%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu%EF%BC%89/Nginx-uWSGI-Flask%E9%83%A8%E7%BD%B2%E8%87%B3Ubuntu/" title="Nginx+uWSGI+Flask部署至Ubuntu"><img src="https://gitee.com/CNhuazhu/tu-chuang1/raw/master/img-blog/Ubuntu_Server_cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Nginx+uWSGI+Flask部署至Ubuntu"/></a><div class="content"><a class="title" href="/2021/10/28/%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu%EF%BC%89/Nginx-uWSGI-Flask%E9%83%A8%E7%BD%B2%E8%87%B3Ubuntu/" title="Nginx+uWSGI+Flask部署至Ubuntu">Nginx+uWSGI+Flask部署至Ubuntu</a><time datetime="2021-10-28T03:01:09.000Z" title="发表于 2021-10-28 11:01:09">2021-10-28</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2021/10/18/Xftp%E4%BC%A0%E8%BE%93%E6%96%87%E4%BB%B6%E5%A4%B1%E8%B4%A5%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/" title="Xftp传输文件失败解决方案"><img src="https://gitee.com/CNhuazhu/tu-chuang1/raw/master/img-blog/Xftp_cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Xftp传输文件失败解决方案"/></a><div class="content"><a class="title" href="/2021/10/18/Xftp%E4%BC%A0%E8%BE%93%E6%96%87%E4%BB%B6%E5%A4%B1%E8%B4%A5%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/" title="Xftp传输文件失败解决方案">Xftp传输文件失败解决方案</a><time datetime="2021-10-18T09:50:16.000Z" title="发表于 2021-10-18 17:50:16">2021-10-18</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2021/10/13/%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu%EF%BC%89/Hexo%E9%83%A8%E7%BD%B2%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88%E7%BB%AD%EF%BC%89%E2%80%94%E2%80%94%E5%BB%BA%E7%AB%8B%E5%BC%95%E5%AF%BC%E9%A1%B5%E5%8F%8A%E5%88%86%E7%AB%99/" title="Hexo部署至服务器（续）——建立引导页及分站"><img src="https://gitee.com/CNhuazhu/tu-chuang1/raw/master/img-blog/Ubuntu_Server_cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Hexo部署至服务器（续）——建立引导页及分站"/></a><div class="content"><a class="title" href="/2021/10/13/%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu%EF%BC%89/Hexo%E9%83%A8%E7%BD%B2%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88%E7%BB%AD%EF%BC%89%E2%80%94%E2%80%94%E5%BB%BA%E7%AB%8B%E5%BC%95%E5%AF%BC%E9%A1%B5%E5%8F%8A%E5%88%86%E7%AB%99/" title="Hexo部署至服务器（续）——建立引导页及分站">Hexo部署至服务器（续）——建立引导页及分站</a><time datetime="2021-10-13T13:49:12.000Z" title="发表于 2021-10-13 21:49:12">2021-10-13</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2021/10/12/%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu%EF%BC%89/Hexo%E9%83%A8%E7%BD%B2%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu-20-04%EF%BC%89/" title="Hexo部署至服务器（Ubuntu 20.04）"><img src="https://gitee.com/CNhuazhu/tu-chuang1/raw/master/img-blog/Ubuntu_Server_cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Hexo部署至服务器（Ubuntu 20.04）"/></a><div class="content"><a class="title" href="/2021/10/12/%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu%EF%BC%89/Hexo%E9%83%A8%E7%BD%B2%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Ubuntu-20-04%EF%BC%89/" title="Hexo部署至服务器（Ubuntu 20.04）">Hexo部署至服务器（Ubuntu 20.04）</a><time datetime="2021-10-12T07:13:40.000Z" title="发表于 2021-10-12 15:13:40">2021-10-12</time></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2021 By 花猪</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener external nofollow noreferrer" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div><div class="footer_custom_text"><a target="_blank" rel="noopener external nofollow noreferrer" href="http://beian.miit.gov.cn/">蜀ICP备2021026748号</a><br>感谢光临<a href="http://cnhuazhu.top/" style="text-decoration:underline">小破站</a>,欢迎您提出宝贵的意见！</div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="font-plus" type="button" title="放大字体"><i class="fas fa-plus"></i></button><button id="font-minus" type="button" title="缩小字体"><i class="fas fa-minus"></i></button><button id="translateLink" type="button" title="简繁转换">繁</button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><a id="to_comment" href="#post-comment" title="直达评论"><i class="fas fa-comments"></i></a><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div id="local-search"><div class="search-dialog"><div class="search-dialog__title" id="local-search-title">本地搜索</div><div id="local-input-panel"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div></div><hr/><div id="local-search-results"></div><span class="search-close-button"><i class="fas fa-times"></i></span></div><div id="search-mask"></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="/js/tw_cn.js"></script><script src="https://cdn.jsdelivr.net/npm/instant.page/instantpage.min.js" type="module"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js"></script><script src="/js/search/local-search.js"></script><div class="js-pjax"><script async="async">var preloader = {
  endLoading: () => {
    document.body.style.overflow = 'auto';
    document.getElementById('loading-box').classList.add("loaded")
  },
  initLoading: () => {
    document.body.style.overflow = '';
    document.getElementById('loading-box').classList.remove("loaded")

  }
}
window.addEventListener('load',()=> {preloader.endLoading()})
setTimeout(function(){preloader.endLoading();}, 3000);</script></div><div class="js-pjax"><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css"><script src="https://cdn.jsdelivr.net/npm/katex@latest/dist/contrib/copy-tex.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/katex@latest/dist/contrib/copy-tex.css"><script>(() => {
  document.querySelectorAll('#article-container span.katex-display').forEach(item => {
    btf.wrap(item, 'div', '', 'katex-wrap')
  })
})()</script><script>(()=>{
  const $countDom = document.getElementById('twikoo-count')
  const init = () => {
    twikoo.init(Object.assign({
      el: '#twikoo-wrap',
      envId: 'hexo-1g41404w9f800e94',
      region: ''
    }, null))
  }

  const getCount = () => {
    twikoo.getCommentsCount({
      envId: 'hexo-1g41404w9f800e94',
      region: '',
      urls: [window.location.pathname],
      includeReply: false
    }).then(function (res) {
      $countDom.innerText = res[0].count
    }).catch(function (err) {
      console.error(err);
    });
  }

  const loadTwikoo = (bool = false) => {
    if (typeof twikoo === 'object') {
      init()
      bool && $countDom && setTimeout(getCount,0)
    } else {
      getScript('https://cdn.jsdelivr.net/npm/twikoo/dist/twikoo.all.min.js').then(()=> {
        init()
        bool && $countDom && setTimeout(getCount,0)
      })
    }
  }

  if ('Twikoo' === 'Twikoo' || !true) {
    if (true) btf.loadComment(document.getElementById('twikoo-wrap'), loadTwikoo)
    else loadTwikoo(true)
  } else {
    window.loadOtherComment = () => {
      loadTwikoo()
    }
  }
})()</script><script>function loadValine () {
  function initValine () {
    const valine = new Valine(Object.assign({
      el: '#vcomment',
      appId: 'VHoX95KsBQSMyzEc3TdpmBkF-MdYXbMMI',
      appKey: 'qnwObDMbgMEKnu1Gp8tk7PYJ',
      placeholder: '欢迎留下你的评论（昵称和邮箱为必填项）',
      avatar: 'monsterid',
      meta: 'nick,mail,link'.split(','),
      pageSize: '10',
      lang: 'zh-CN',
      recordIP: false,
      serverURLs: '',
      emojiCDN: '',
      emojiMaps: "",
      enableQQ: false,
      path: window.location.pathname,
      requiredFields: ["nick,mail"],
      visitor: false
    }, null))
  }

  if (typeof Valine === 'function') initValine() 
  else getScript('https://cdn.jsdelivr.net/npm/valine/dist/Valine.min.js').then(initValine)
}

if ('Twikoo' === 'Valine' || !true) {
  if (true) btf.loadComment(document.getElementById('vcomment'),loadValine)
  else setTimeout(loadValine, 0)
} else {
  function loadOtherComment () {
    loadValine()
  }
}</script></div><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><script src="https://pv.sohu.com/cityjson?ie=utf-8"></script><script src="/js/ip_content.js"></script><script src="/js/timing.js"></script><script src="https://cdn.jsdelivr.net/gh/xiabo2/CDN@latest/fishes.js"></script><script src="/js/footer.js"></script><script src="/js/ginkgo-leaf.js"></script><script id="canvas_nest" defer="defer" color="0,0,0" opacity="0.7" zIndex="-1" count="99" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-nest.min.js"></script><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/activate-power-mode.min.js"></script><script>POWERMODE.colorful = true;
POWERMODE.shake = false;
POWERMODE.mobile = false;
document.body.addEventListener('input', POWERMODE);
</script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><div class="pjax-reload"><script async="async">var arr = document.getElementsByClassName('recent-post-item');
for(var i = 0;i<arr.length;i++){
    arr[i].classList.add('wow');
    arr[i].classList.add('animate__fadeInLeft');
    arr[i].setAttribute('data-wow-duration', '600ms');
    arr[i].setAttribute('data-wow-delay', '200ms');
    arr[i].setAttribute('data-wow-offset', '100');
    arr[i].setAttribute('data-wow-iteration', '1');
  }</script><script async="async">var arr = document.getElementsByClassName('card-widget');
for(var i = 0;i<arr.length;i++){
    arr[i].classList.add('wow');
    arr[i].classList.add('animate__fadeInRightBig');
    arr[i].setAttribute('data-wow-duration', '');
    arr[i].setAttribute('data-wow-delay', '');
    arr[i].setAttribute('data-wow-offset', '');
    arr[i].setAttribute('data-wow-iteration', '');
  }</script></div><script defer="defer" src="https://cdn.jsdelivr.net/gh/graingert/wow@1.3.0/dist/wow.min.js"></script><script defer="defer" src="/js/wow_init.js"></script></div><!-- hexo injector body_end start --><script data-pjax>
                        function butterfly_swiper_injector_config(){
                          var parent_div_git = document.getElementById('recent-posts');
                          var item_html = '<div class="recent-post-item" style="height: auto;width: 100%"><div class="blog-slider swiper-container-fade swiper-container-horizontal" id="swiper_container"><div class="blog-slider__wrp swiper-wrapper" style="transition-duration: 0ms;"><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><a class="blog-slider__img" href="2021/03/28/Hexo魔改/Hexo魔改记录/" alt=""><img width="48" height="48" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/RotatingImage4.jpg" alt=""/></a><div class="blog-slider__content"><span class="blog-slider__code">2021-03-28</span><a class="blog-slider__title" href="2021/03/28/Hexo魔改/Hexo魔改记录/" alt="">Hexo魔改记录</a><div class="blog-slider__text">Hexo魔改记录</div><a class="blog-slider__button" href="2021/03/28/Hexo魔改/Hexo魔改记录/" alt="">详情   </a></div></div><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><a class="blog-slider__img" href="2021/08/02/Vue/Vue学习笔记/" alt=""><img width="48" height="48" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/RotatingImage5.jpg" alt=""/></a><div class="blog-slider__content"><span class="blog-slider__code">2021-08-02</span><a class="blog-slider__title" href="2021/08/02/Vue/Vue学习笔记/" alt="">Vue学习笔记</a><div class="blog-slider__text">本文将介绍Vue的基础语法</div><a class="blog-slider__button" href="2021/08/02/Vue/Vue学习笔记/" alt="">详情   </a></div></div><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><a class="blog-slider__img" href="2021/03/28/Java/Java学习记录/" alt=""><img width="48" height="48" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/RotatingImage8.jpg" alt=""/></a><div class="blog-slider__content"><span class="blog-slider__code">2021-03-28</span><a class="blog-slider__title" href="2021/03/28/Java/Java学习记录/" alt="">Java学习记录</a><div class="blog-slider__text">Java学习记录</div><a class="blog-slider__button" href="2021/03/28/Java/Java学习记录/" alt="">详情   </a></div></div><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><a class="blog-slider__img" href="2021/03/28/操作系统/操作系统学习笔记/" alt=""><img width="48" height="48" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/RotatingImage7.jpg" alt=""/></a><div class="blog-slider__content"><span class="blog-slider__code">2021-03-28</span><a class="blog-slider__title" href="2021/03/28/操作系统/操作系统学习笔记/" alt="">操作系统学习笔记</a><div class="blog-slider__text">记录操作系统学习历程</div><a class="blog-slider__button" href="2021/03/28/操作系统/操作系统学习笔记/" alt="">详情   </a></div></div><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><a class="blog-slider__img" href="2021/03/28/计算机网络/计算机网络学习笔记/" alt=""><img width="48" height="48" src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/RotatingImage3.jpg" alt=""/></a><div class="blog-slider__content"><span class="blog-slider__code">2021-03-28</span><a class="blog-slider__title" href="2021/03/28/计算机网络/计算机网络学习笔记/" alt="">计算机网络学习笔记</a><div class="blog-slider__text">记录计算机网络学习历程</div><a class="blog-slider__button" href="2021/03/28/计算机网络/计算机网络学习笔记/" alt="">详情   </a></div></div></div><div class="blog-slider__pagination swiper-pagination-clickable swiper-pagination-bullets"></div></div></div>';
                          console.log('已挂载butterfly_swiper')
                          // parent_div_git.innerHTML=item_html+parent_div_git.innerHTML // 无报错，但不影响使用(支持pjax跳转)
                          parent_div_git.insertAdjacentHTML("afterbegin",item_html) // 有报错，但不影响使用(支持pjax跳转)
                          }
                        if( document.getElementById('recent-posts') && (location.pathname ==='all'|| 'all' ==='all')){
                        butterfly_swiper_injector_config()
                        }
                      </script><script defer src="https://cdn.jsdelivr.net/npm/hexo-butterfly-swiper/lib/swiper.min.js"></script><script defer data-pjax src="https://cdn.jsdelivr.net/npm/hexo-butterfly-swiper/lib/swiper_init.js"></script><!-- hexo injector body_end end --><script src="/live2dw/lib/L2Dwidget.min.js?094cbace49a39548bed64abff5988b05"></script><script>L2Dwidget.init({"pluginRootPath":"live2dw/","pluginJsPath":"lib/","pluginModelPath":"assets/","tagMode":false,"debug":false,"model":{"scale":1,"hHeadPos":0.5,"vHeadPos":0.618,"jsonPath":"/live2dw/assets/assets/tororo.model.json"},"display":{"superSample":2,"width":200,"height":400,"position":"left","hOffset":0,"vOffset":-105},"mobile":{"show":false,"scale":0.5},"react":{"opacityDefault":0.7,"opacityOnHover":0.8},"log":false});</script></body></html>